NaNs 突然出现在 sklearn KFolds 中
NaNs suddenly appearing for sklearn KFolds
我正在尝试 运行 对我的数据集进行交叉验证。数据看起来很干净,但是当我尝试 运行 它时,我的一些数据被 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
我确定我做错了什么,有什么想法吗?一如既往,非常感谢!
要解决问题,请使用 .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
上工作,它有一个很好的基于 indexing/labeling 的整数,但在 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 returns NaN(因为未找到)并且 4 代表实际行 - 因为它在 X_train 内。为了解决它 - 只需切换到 .iloc
或手动重建 X_train.
的索引
我正在尝试 运行 对我的数据集进行交叉验证。数据看起来很干净,但是当我尝试 运行 它时,我的一些数据被 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
我确定我做错了什么,有什么想法吗?一如既往,非常感谢!
要解决问题,请使用 .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
上工作,它有一个很好的基于 indexing/labeling 的整数,但在 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 returns NaN(因为未找到)并且 4 代表实际行 - 因为它在 X_train 内。为了解决它 - 只需切换到 .iloc
或手动重建 X_train.