【问题标题】:NaNs suddenly appearing for sklearn KFoldssklearn KFolds 突然出现 NaN
【发布时间】:2017-01-15 13:29:00
【问题描述】:

我正在尝试对我的数据集进行交叉验证。数据看起来很干净,但是当我尝试运行它时,我的一些数据被 NaN 替换了。我不确定为什么。有人见过这个吗?

y, X = np.ravel(df_test['labels']), df_test[['variation', 'length', 'tempo']]
X_train, X_test, y_train, y_test = cv.train_test_split(X,y,test_size=.30, random_state=4444)

这是我的 X 数据在 KFolds 之前的样子: variation length tempo 0 0.005144 1183.148118 135.999178 1 0.002595 720.165442 117.453835 2 0.008146 397.500952 112.347147 3 0.005367 1109.819501 172.265625 4 0.001631 509.931973 135.999178 5 0.001620 560.365714 151.999081 6 0.002513 763.377778 107.666016 7 0.009262 502.083628 99.384014 8 0.000610 500.017052 143.554688 9 0.000733 269.001723 117.453835

我的 Y 数据如下所示: array([ True, False, False, True, True, True, True, False, True, False], dtype=bool)

现在当我尝试做交叉验证时:

kf = KFold(X_train.shape[0], n_folds=4, shuffle=True)

for train_index, val_index in kf:
    cv_train_x = X_train.ix[train_index]
    cv_val_x = X_train.ix[val_index]
    cv_train_y = y_train[train_index]
    cv_val_y = y_train[val_index]
    print cv_train_x

    logreg = LogisticRegression(C = .01)
    logreg.fit(cv_train_x, cv_train_y)
    pred = logreg.predict(cv_val_x)
    print accuracy_score(cv_val_y, pred)

当我尝试运行此程序时,出现以下错误,因此我添加了打印语句。
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

在我的打印语句中,这就是它打印的内容,一些数据变成了 NaN。 variation length tempo 0 NaN NaN NaN 1 NaN NaN NaN 2 0.008146 397.500952 112.347147 3 0.005367 1109.819501 172.265625 4 0.001631 509.931973 135.999178

我确定我做错了什么,有什么想法吗?一如既往,非常感谢!

【问题讨论】:

  • 请提供完整代码,我很确定你省略了导致错误的部分
  • 我没有遗漏任何内容,尽管我在问题中输入的数据只是其中的一个 sn-p。
  • 所以打印语句后没有任何行
  • 啊,是的,我愿意,但这只是我试图运行 Kfolds 的算法。 logreg = LogisticRegression(C = .01) logreg.fit(cv_train_x, cv_train_y) pred = logreg.predict(cv_val_x) print accuracy_score(cv_val_y, pred) 对不起,我不知道如何使代码看起来像代码,它由于 NaN 无法进入算法,因此在尝试拟合时会出错。
  • 我无法重现该错误。请尝试创建最小的复制示例,实际显示此错误的数据 + 代码。

标签: python machine-learning scikit-learn cross-validation


【解决方案1】:

解决使用.iloc 而不是.ix 来索引您的熊猫数据框

for train_index, val_index in kf:
    cv_train_x = X_train.iloc[train_index]
    cv_val_x = X_train.iloc[val_index]
    cv_train_y = y_train[train_index]
    cv_val_y = y_train[val_index]
    print cv_train_x

    logreg = LogisticRegression(C = .01)
    logreg.fit(cv_train_x, cv_train_y)
    pred = logreg.predict(cv_val_x)
    print accuracy_score(cv_val_y, pred)

使用ix 进行索引通常等同于使用.loc,这是基于标签 索引,而不是基于索引。虽然.loc 适用于X,它有一个很好的基于整数的索引/标签,但在 cv split 之后这条规则不再存在,你会得到类似的东西:

        length       tempo  variation
4   509.931973  135.999178   0.001631
2   397.500952  112.347147   0.008146
7   502.083628   99.384014   0.009262
6   763.377778  107.666016   0.002513
5   560.365714  151.999081   0.001620
3  1109.819501  172.265625   0.005367
9   269.001723  117.453835   0.000733

现在你不再有标签 0 或 1,所以如果你这样做了

X_train.loc[1]

你会得到一个异常

KeyError: 'the label [1] is not in the [index]'

但是,如果您请求多个标签(其中至少存在一个),pandas 会出现静默错误。因此,如果你这样做

 X_train.loc[[1,4]]

你会得到

       length       tempo  variation
1         NaN         NaN        NaN
4  509.931973  135.999178   0.001631

正如所料 - 1 返回 NaN(因为它没有找到)并且 4 代表实际行 - 因为它在 X_train 内。为了解决它 - 只需切换到 .iloc 或手动重建 X_train 的索引。

【讨论】:

  • 非常感谢 lejlot,修复了它。非常感谢您的时间和帮助!
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多