在scikit-learn的Pipeline中包含分类器进行交叉验证有意义吗?
假设我有一个典型的训练和测试数据集设置,分别是 X_train
、y_train
、X_test
和 y_test
,还有一个非常简单的处理流程,我想在交叉验证中使用它(我会有多个更复杂的处理流程,但这只是一个简化的例子)。
当我按照下面的代码进行交叉验证时,我在想 Pipeline
的方法到底能不能用。
我的问题是,Pipeline
是在最后一个“测试”折上调用 .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 个回答
2
默认情况下,cross_val_score
会在 cv
指定的 test
部分进行预测(你可以查看 [(train, test) for train, test in cv]
)。如果 cv
将 train
和 test
分开,并且它们之间没有重叠(比如使用 KFold
或其他交叉验证的方式),那么训练好的模型在预测时总是会使用那些被“保留”的数据。
可以查看 这一行代码