将分类器包含在scikit-learn的Pipeline中进行交叉验证是否有意义?

时间:2014-08-11 21:00:13

标签: python scikit-learn

我们假设我有典型的培训和测试数据集设置(X_trainy_trainX_testy_test)和一个非常简单的管道我想在交叉验证中使用(我会有多个更复杂的管道,但这只是一个简化的例子)

当我正在进行如下代码所示的交叉验证时,我想知道Pipeline方法是否真的有效。

我的问题是,Pipeline是否在最后一次"测试" -fold上调用了.predict()方法,或者调用了.predict()用于训练的折叠?

from sklearn.cross_validation import cross_val_score, KFold
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import StandardScaler

pipe = Pipeline(steps=[
    ('scaler', StandardScaler()),           
    ('classification', GaussianNB())   
    ])

cv = KFold(n=X_train.shape[0], n_folds=10)

scores = cross_val_score(pipe, X_train, y_train, cv=cv, scoring='accuracy')

或许是一个更简单的例子:

1 个答案:

答案 0 :(得分:2)

默认情况下,cross_val_score始终会在test指示的cv部分进行预测(请查看[(train, test) for train, test in cv])。如果cvtraintest分开以使它们不相交(例如KFold或其他交叉验证拆分对象的情况),则拟合的估算器/管道将始终预测在提出数据。

请参阅this line