我们假设我有典型的培训和测试数据集设置(X_train
,y_train
,X_test
,y_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')
或许是一个更简单的例子:
答案 0 :(得分:2)
默认情况下,cross_val_score
始终会在test
指示的cv
部分进行预测(请查看[(train, test) for train, test in cv]
)。如果cv
将train
和test
分开以使它们不相交(例如KFold
或其他交叉验证拆分对象的情况),则拟合的估算器/管道将始终预测在提出数据。
请参阅this line