如何在scikit learn(sklearn)的Pipeline中应用StandardScaler



在下面的示例中,

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))

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

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

当你使用StandardScaler作为Pipeline内部的步骤时,scikit learn将在内部为你完成这项工作。


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

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

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


使用类似的东西:

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.decomposition import PCA
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_)

运行此代码后(当您调用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)

然后使用:

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

快速回答:您的方法是正确的。


虽然上面的答案很好,但我只想指出一些微妙之处:

bestrongcore_[1]是最佳的交叉验证度量,而不是模型[2]的泛化性能。为了评估找到的最佳参数的泛化程度,您应该调用测试集上的分数,就像您所做的那样。因此,需要从将数据划分为训练集和测试集开始,只在X_train,y_train中拟合网格搜索,然后用X_test,y_test[2]对其进行评分。


深潜:

将数据分为训练集验证集试集三重是防止网格搜索过程中参数过拟合的一种方法。另一方面,GridSearchCV在训练集中使用交叉验证,而不是同时使用训练集和验证集,但这并不能取代测试集。这可以在[2]和[3]中进行验证。


参考文献:

[1] GridSearchCV

[2] Python 机器学习简介

[3] 3.1交叉验证:评估估计器性能

相关内容

最新更新