Кто такой Скотт? - ValueError в паре Seaborn: не удалось преобразовать строку в число с плавающей точкой: 'scott' - PullRequest
0 голосов
/ 26 апреля 2020

Кто такой Скотт?

Проблема

При попытке добавить атрибут Education из набора данных Loan Prediction в пару с использованием seaborn:

ValueError Traceback (последний вызов был последним) ~ / anaconda3 / lib / python3 .7 / site-packages / statsmodels / nonparametric / kde.py в kdensityfft (X, ядро, bw, веса, размер сетки, настройка, клип, cut, retgrid) 450 try: -> 451 bw = float (bw) 452 за исключением:

ValueError: не удалось преобразовать строку в float: 'scott'

Я посмотрел через необработанные данные, но я нигде не смог найти 'Скотта', поэтому мой вопрос: откуда это взялось и как я могу это исправить?

Также я получаю ошибку времени выполнения "RuntimeError: Выбранная пропускная способность KDE равна 0. Невозможно оценить плотность. " Я не уверен, что это вызвано первой ошибкой или тем, что это отдельная проблема. Если бы кто-нибудь мог пролить свет на это, я был бы признателен.

Набор данных

Я использую найденный набор данных прогноза ссуды здесь . Атрибуты следующие:

    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

Код

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")

Ошибка

---------------------------------------------------------------------------
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.


1 Ответ

1 голос
/ 26 апреля 2020

scott - это имя метода выбора полосы пропускания при построении оценки плотности ядра (KDE). Он назван в честь DW Scott (1).

Я не могу посмотреть на ваши данные, но я предполагаю, что что-то странное с одной из пар переменных для определенного уровня оттенка, что мешает Seaborn вычислить правильная полоса пропускания.

вы можете использовать diag_kws для передачи аргументов в sns.kdeplot(), который используется парным графиком для построения одномерных распределений по диагонали.

например:

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

заставит sns.kdeplot() использовать метод "silverman" для выбора полосы пропускания, который может работать лучше, чем метод Скотта в вашем случае?

(1) Д.В. Скотт, «Многофакторная оценка плотности: теория, практика и визуализация», John Wiley & Sons, Нью-Йорк, Честер, 1992.

EDIT

Чтобы попытаться определить виновника, вам придется использовать PairGrid вместо pairplot(). PairGrid позволяет использовать пользовательскую функцию для построения диагонали. Если вы включите оператор print в эту функцию, вы увидите, какие данные будут переданы в sns.kdeplot (). Выполнение должно быть остановлено в точке, где данные являются «неправильными», и вы можете выяснить, что с этим делать.

, например:

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)

Для каждой переменной ( столбец), и для каждого levey вы получите вывод, который будет выглядеть так:

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)}
(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...