sklearn KFolds过程中突然出现NaN值

我在尝试对数据集进行交叉验证。数据看起来是干净的,但在运行时发现部分数据被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)

这是KFolds之前我的X数据的样子: variation length tempo0 0.005144 1183.148118 135.9991781 0.002595 720.165442 117.4538352 0.008146 397.500952 112.3471473 0.005367 1109.819501 172.2656254 0.001631 509.931973 135.9991785 0.001620 560.365714 151.9990816 0.002513 763.377778 107.6660167 0.009262 502.083628 99.3840148 0.000610 500.017052 143.5546889 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 tempo0 NaN NaN NaN1 NaN NaN NaN2 0.008146 397.500952 112.3471473 0.005367 1109.819501 172.2656254 0.001631 509.931973 135.999178

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


回答:

解决方法是使用.iloc代替.ix来索引你的pandas数据框

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,这是基于标签的索引,而不是基于索引的索引。虽然.locX上有效,因为它有一个很好的基于整数的索引/标签,但在cv分割后这条规则不再适用,你会得到类似这样的东西:

        length       tempo  variation4   509.931973  135.999178   0.0016312   397.500952  112.347147   0.0081467   502.083628   99.384014   0.0092626   763.377778  107.666016   0.0025135   560.365714  151.999081   0.0016203  1109.819501  172.265625   0.0053679   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  variation1         NaN         NaN        NaN4  509.931973  135.999178   0.001631

正如预期的 – 1返回NaN值(因为它未找到),而4代表实际的行 – 因为它在X_train中。为了解决这个问题 – 只需切换到.iloc或手动重建X_train的索引。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注