web-dev-qa-db-fra.com

Qui est Scott? - ValueError dans Seaborn pairplot: Impossible de convertir la chaîne en float: 'scott'

Qui est Scott?

Problème

J'obtiens l'erreur suivante en essayant d'ajouter l'attribut Education de l'ensemble de données Loan Prediction à un pairplot à l'aide de seaborn:

ValueError Traceback (dernier appel le plus récent) ~/anaconda3/lib/python3.7/site-packages/statsmodels/nonparametric/kde.py dans kdensityfft (X, kernel, bw, weights, gridsize, Adjust, clip, cut, retgrid) 450 essayez: -> 451 bw = float (bw) 452 sauf:

ValueError: impossible de convertir la chaîne en float: 'scott'

J'ai parcouru les données brutes, mais je n'ai trouvé "scott" nulle part, donc ma question est d'où cela vient-il et comment puis-je y remédier?

J'obtiens également une erreur d'exécution "RuntimeError: la bande passante KDE sélectionnée est 0. Impossible d'estimer la densité.". Je ne suis pas sûr que cela soit causé par la première erreur ou qu'il s'agisse d'un problème distinct. Si quelqu'un pouvait faire la lumière là-dessus, je lui en serais reconnaissant.

Base de données

J'utilise l'ensemble de données de prévision de prêt trouvé ici . Les attributs sont les suivants:

    Loan_ID     Gender  Married     Dependents  Education     Self_Employed     ApplicantIncome     CoapplicantIncome   LoanAmount  Loan_Amount_Term    Credit_History  Property_Area   Loan_Status
0   LP001002    Male    No          0           Graduate      No                5849                0.0                 NaN         360.0               1.0             Urban           Y
1   LP001003    Male    Yes         1           Graduate      No                4583                1508.0              128.0       360.0               1.0             Rural           N
2   LP001005    Male    Yes         0           Graduate      Yes               3000                0.0                 66.0        360.0               1.0             Urban           Y
3   LP001006    Male    Yes         0           Not Graduate  No                2583                2358.0              120.0       360.0               1.0             Urban           Y
4   LP001008    Male    No          0           Graduate      No                6000                0.0                 141.0       360.0               1.0             Urban           Y

Code

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline # I'm using ipython notebook

train_data = pd.read_csv("train_ctrUa4K.csv")

bad_credit = train_data[train_data["Credit_History"] == 0]
bad_credit["Education"] = bad_credit["Education"].map({"Graduate":1,"Not Graduate":0})
sns.pairplot(bad_credit,vars=["ApplicantIncome","Education","LoanAmount"],hue="Loan_Status")

Erreur

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/anaconda3/lib/python3.7/site-packages/statsmodels/nonparametric/kde.py in kdensityfft(X, kernel, bw, weights, gridsize, adjust, clip, cut, retgrid)
    450     try:
--> 451         bw = float(bw)
    452     except:

ValueError: could not convert string to float: 'scott'

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
<ipython-input-25-0cd48ab0d803> in <module>
      2 bad_credit = train_data[train_data["Credit_History"] == 0]
      3 bad_credit["Education"] = bad_credit["Education"].map({"Graduate":1,"Not Graduate":0})
----> 4 sns.pairplot(bad_credit,vars=["ApplicantIncome","Education","LoanAmount"],hue="Loan_Status")

~/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py in pairplot(data, hue, hue_order, palette, vars, x_vars, y_vars, kind, diag_kind, markers, height, aspect, corner, dropna, plot_kws, diag_kws, grid_kws, size)
   2119             diag_kws.setdefault("shade", True)
   2120             diag_kws["legend"] = False
-> 2121             grid.map_diag(kdeplot, **diag_kws)
   2122 
   2123     # Maybe plot on the off-diagonals

~/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py in map_diag(self, func, **kwargs)
   1488                     data_k = utils.remove_na(data_k)
   1489 
-> 1490                 func(data_k, label=label_k, color=color, **kwargs)
   1491 
   1492             self._clean_axis(ax)

~/anaconda3/lib/python3.7/site-packages/seaborn/distributions.py in kdeplot(data, data2, shade, vertical, kernel, bw, gridsize, cut, clip, legend, cumulative, shade_lowest, cbar, cbar_ax, cbar_kws, ax, **kwargs)
    703         ax = _univariate_kdeplot(data, shade, vertical, kernel, bw,
    704                                  gridsize, cut, clip, legend, ax,
--> 705                                  cumulative=cumulative, **kwargs)
    706 
    707     return ax

~/anaconda3/lib/python3.7/site-packages/seaborn/distributions.py in _univariate_kdeplot(data, shade, vertical, kernel, bw, gridsize, cut, clip, legend, ax, cumulative, **kwargs)
    293         x, y = _statsmodels_univariate_kde(data, kernel, bw,
    294                                            gridsize, cut, clip,
--> 295                                            cumulative=cumulative)
    296     else:
    297         # Fall back to scipy if missing statsmodels

~/anaconda3/lib/python3.7/site-packages/seaborn/distributions.py in _statsmodels_univariate_kde(data, kernel, bw, gridsize, cut, clip, cumulative)
    365     fft = kernel == "gau"
    366     kde = smnp.KDEUnivariate(data)
--> 367     kde.fit(kernel, bw, fft, gridsize=gridsize, cut=cut, clip=clip)
    368     if cumulative:
    369         grid, y = kde.support, kde.cdf

~/anaconda3/lib/python3.7/site-packages/statsmodels/nonparametric/kde.py in fit(self, kernel, bw, fft, weights, gridsize, adjust, cut, clip)
    138             density, grid, bw = kdensityfft(endog, kernel=kernel, bw=bw,
    139                     adjust=adjust, weights=weights, gridsize=gridsize,
--> 140                     clip=clip, cut=cut)
    141         else:
    142             density, grid, bw = kdensity(endog, kernel=kernel, bw=bw,

~/anaconda3/lib/python3.7/site-packages/statsmodels/nonparametric/kde.py in kdensityfft(X, kernel, bw, weights, gridsize, adjust, clip, cut, retgrid)
    451         bw = float(bw)
    452     except:
--> 453         bw = bandwidths.select_bandwidth(X, bw, kern) # will cross-val fit this pattern?
    454     bw *= adjust
    455 

~/anaconda3/lib/python3.7/site-packages/statsmodels/nonparametric/bandwidths.py in select_bandwidth(x, bw, kernel)
    172         # eventually this can fall back on another selection criterion.
    173         err = "Selected KDE bandwidth is 0. Cannot estiamte density."
--> 174         raise RuntimeError(err)
    175     else:
    176         return bandwidth

RuntimeError: Selected KDE bandwidth is 0. Cannot estiamte density.


2
10778403

scott est le nom d'une méthode pour choisir la bande passante lors du traçage d'une estimation de densité de noyau (KDE). Il porte le nom de DW Scott (1).

Je ne peux pas regarder vos données, mais je suppose que quelque chose est bizarre avec l'une des paires de variables pour un certain niveau de teinte qui empêche seaborn de calculer la bande passante appropriée.

vous pouvez utiliser diag_kws pour passer des arguments à sns.kdeplot() , qui est utilisé par pairplot pour tracer les distributions univariées sur la diagonale.

par exemple:

sns.pairplot(..., diag_kws={'bw':'silverman'})

forcerait sns.kdeplot() à utiliser la méthode "silverman" pour choisir la bande passante, qui pourrait mieux fonctionner que la méthode Scott dans votre cas?

(1) D.W. Scott, "Estimation de la densité multivariée: théorie, pratique et visualisation", John Wiley & Sons, New York, Chicester, 1992.

[~ # ~] modifier [~ # ~]

Pour essayer de localiser le coupable, vous devrez utiliser PairGrid au lieu de pairplot(). PairGrid vous permet d'utiliser une fonction personnalisée pour tracer la diagonale. Si vous incluez une instruction d'impression dans cette fonction, vous pouvez voir quelles sont les données qui seraient passées à sns.kdeplot (). L'exécution doit s'arrêter au moment où les données sont "incorrectes" et vous pourrez peut-être savoir quoi faire avec cela.

par exemple:

def test_func(*data, **kwargs):
    print("data received:", data)
    print("hue name + other params:", kwargs)
    sns.kdeplot(*data, **kwargs)

iris = sns.load_dataset('iris')
g = sns.PairGrid(iris, hue="species")
g = g.map_diag(test_func)

Pour chaque variable (colonne), et pour chaque niveau, vous obtenez une sortie qui ressemblera à ceci:

data received: (array([5.1, 4.9, 4.7, 4.6, 5. , 5.4, 4.6, 5. , 4.4, 4.9, 5.4, 4.8, 4.8,
       4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5. ,
       5. , 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5. , 5.5, 4.9, 4.4,
       5.1, 5. , 4.5, 4.4, 5. , 5.1, 4.8, 5.1, 4.6, 5.3, 5. ]),)
hue name + other params: {'label': 'setosa', 'color': (0.12156862745098039, 0.4666666666666667, 0.7058823529411765)}
data received: (array([7. , 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5. , 5.9, 6. ,
       6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6,
       6.8, 6.7, 6. , 5.7, 5.5, 5.5, 5.8, 6. , 5.4, 6. , 6.7, 6.3, 5.6,
       5.5, 5.5, 6.1, 5.8, 5. , 5.6, 5.7, 5.7, 6.2, 5.1, 5.7]),)
hue name + other params: {'label': 'versicolor', 'color': (1.0, 0.4980392156862745, 0.054901960784313725)}
(...)
2
Diziet Asahi