在 Sklearn PIpeline 和交叉验证中使用缩放器

LuL*_*U W 1 python pipeline scikit-learn cross-validation

之前看过一个帖子,代码是这样的:

scalar = StandardScaler()
clf = svm.LinearSVC()

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)])

cv = KFold(n_splits=4)
scores = cross_val_score(pipeline, X, y, cv = cv)
Run Code Online (Sandbox Code Playgroud)

我的理解是:当我们应用缩放,我们应该使用3出4倍来计算平均值和标准差,那么我们应用均值和标准差的所有4倍。

在上面的代码中,我怎么知道 Sklearn 遵循相同的策略?另一方面,如果 sklearn 不遵循相同的策略,这意味着 sklearn 将计算所有 4 折的均值/标准差。这是否意味着我不应该使用上述代码?

我喜欢上面的代码,因为它节省了大量的时间。

Dav*_*man 6

在您给出的示例中,我将使用sklearn.model_selection.train_test_split以下方法添加一个额外的步骤:

folds = 4

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=(1/folds), random_state=0, stratify=y)

scalar = StandardScaler()
clf = svm.LinearSVC()

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)])

cv = KFold(n_splits=(folds - 1))
scores = cross_val_score(pipeline, X_train, y_train, cv = cv)
Run Code Online (Sandbox Code Playgroud)

我认为最好的做法是只使用训练数据集(即X_train, y_train)调整模型的超参数和测试数据集(即当X_test, y_test)应作为最后的检查,以确保您的模型不偏朝向验证折叠。那时,您会将scaler适合您的训练数据集的相同内容应用到您的测试数据集。