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

0 投票
1 回答
866 浏览
提问于 2025-04-18 16:53

假设我有一个典型的训练和测试数据集设置,分别是 X_trainy_trainX_testy_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])。如果 cvtraintest 分开,并且它们之间没有重叠(比如使用 KFold 或其他交叉验证的方式),那么训练好的模型在预测时总是会使用那些被“保留”的数据。

可以查看 这一行代码

撰写回答