我在尝试对数据集进行交叉验证。数据看起来是干净的,但在运行时发现部分数据被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
,这是基于标签的索引,而不是基于索引的索引。虽然.loc
在X
上有效,因为它有一个很好的基于整数的索引/标签,但在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的索引。