如何在sklearn中只运行一次交叉验证?

时间:2017-10-28 00:41:34

标签: scikit-learn

我让他跟随代码在SkLearn中运行10倍交叉验证:

cv = model_selection.KFold(n_splits=10, shuffle=True, random_state=0)
scores = model_selection.cross_val_score(MyEstimator(), x_data, y_data, cv=cv, scoring='mean_squared_error') * -1

出于调试目的,当我尝试使MyEstimator工作时,我想只运行这个交叉验证的一个折叠,而不是全部10.有一个简单的方法来保留这些代码,但只是说运行先折叠然后退出?

我仍然希望将这些数据分成10个部分,但只有10个部分的一个组合适合并得分,而不是10个组合。

1 个答案:

答案 0 :(得分:1)

不,我认为不是cross_val_score。您可以将n_splits设置为最小值2,但仍然是50:50的火车分割,您可能不需要测试。

如果您希望保持90:10的比例并测试代码的其他部分,例如MyEstimator(),那么您可以使用解决方法。

您可以使用KFold.split()获取第一组训练和测试索引,然后在第一次迭代后中断循环。

cv = model_selection.KFold(n_splits=10, shuffle=True, random_state=0)
for train_index, test_index in cv.split(x_data):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = x_data[train_index], x_data[test_index]
    y_train, y_test = y_data[train_index], y_data[test_index]
    break

现在使用此X_train,y_train训练估算器和X_test,y_test对其进行评分。

而不是:

scores = model_selection.cross_val_score(MyEstimator(), 
                                         x_data, y_data, 
                                         cv=cv, 
                                         scoring='mean_squared_error')

您的代码变为:

myEstimator_fitted = MyEstimator().fit(X_train, y_train)
y_pred = myEstimator_fitted.predict(X_test)

from sklearn.metrics import mean_squared_error

# I am appending to a scores list object, because that will be output of cross_val_score.
scores = []
scores.append(mean_squared_error(y_test, y_pred))

请放心,cross_val_score将仅在内部执行此操作,只是对并行处理进行一些增强。