如何在scikit-learn(sklearn)的管道中应用StandardScaler?

use*_*827 4 python scikit-learn

在下面的示例中,

pipe = Pipeline([
        ('scale', StandardScaler()),
        ('reduce_dims', PCA(n_components=4)),
        ('clf', SVC(kernel = 'linear', C = 1))])

param_grid = dict(reduce_dims__n_components=[4,6,8],
                  clf__C=np.logspace(-4, 1, 6),
                  clf__kernel=['rbf','linear'])

grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, n_jobs=1, verbose=2)
grid.fit(X_train, y_train)
print(grid.score(X_test, y_test))
Run Code Online (Sandbox Code Playgroud)

我正在使用StandardScaler(),这也是将其应用于测试集的正确方法吗?

mak*_*kis 12

是的,这是正确的方法,但是您的代码中有一个小错误。让我为您分解一下。

当您将StandardScaler用作内部步骤时,Pipelinescikit-learn将在内部为您完成这项工作。


发生的情况可以描述如下:

  • 步骤0:数据被分成TRAINING dataTEST data根据cv您在指定的参数GridSearchCV
  • 步骤1:将scaler其安装在TRAINING data
  • 步骤2:scaler转换TRAINING data
  • 步骤3:使用变换后的模型进行拟合/训练 TRAINING data
  • 步骤4:scaler用于转换TEST data
  • 第5步:predict使用transformed TEST data

注意:您应该使用grid.fit(X, y) grid.fit(X_train, y_train)因为GridSearchCV会自动将数据分割为训练和测试数据(该内部发生)。


使用这样的东西:

pipe = Pipeline([
        ('scale', StandardScaler()),
        ('reduce_dims', PCA(n_components=4)),
        ('clf', SVC(kernel = 'linear', C = 1))])

param_grid = dict(reduce_dims__n_components=[4,6,8],
                  clf__C=np.logspace(-4, 1, 6),
                  clf__kernel=['rbf','linear'])

grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, n_jobs=1, verbose=2, scoring= 'accuracy')
grid.fit(X, y)
print(grid.best_score_)
print(grid.cv_results_)
Run Code Online (Sandbox Code Playgroud)

运行此代码后(调用时grid.fit(X, y)),您可以在grid.fit()返回的结果对象中访问网格搜索的结果。该best_score_成员可以访问在优化过程中观察到的最佳分数,并best_params_描述获得最佳结果的参数组合。


重要编辑1:如果要保留原始数据集的验证数据集,请使用以下命令:

X_for_gridsearch, X_future_validation, y_for_gridsearch, y_future_validation 
    = train_test_split(X, y, test_size=0.15, random_state=1)
Run Code Online (Sandbox Code Playgroud)

然后使用:

grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, n_jobs=1, verbose=2, scoring= 'accuracy')
grid.fit(X_for_gridsearch, y_for_gridsearch)
Run Code Online (Sandbox Code Playgroud)

  • 否。如果您在整个数据集上使用“ GridSearchCV”,那么您已经在整个数据集上训练了超参数,并且不再具有用于验证模型的测试集。 (4认同)
  • @seralouk,我的意思是你能为 `.predict()` 添加一行吗?如果我做类似“grid.predict(X_test)”的事情,它会工作而无需再次指定 StandardScalar 吗? (2认同)
  • 我认为原始海报想知道是否在整个交叉验证后调用 grid.predict(X_test) ,缩放仍然适用于 X_test?如果是这样,使用来自 X_train 的均值/标准或基于 X_Test 计算的新均值/标准是什么类型的缩放。我想知道同样的事情。感谢任何帮助。 (2认同)
  • @serafeim 这确实是一个很好的答案。当我通常使用 StandardScaler 时,我使用 StandardScaler 的两个不同实例来缩放数据。我总是使用一个缩放器来适应 X_train,并使用一个缩放器来适应 y_train,然后我使用每个实例分别转换 X_test 和 y_test,以避免任何异常值等被“泄漏”到训练中。有没有办法使用管道来做到这一点,并且是否需要额外的缩放器? (2认同)