是的,这是正确的方法,但您的代码中有一个小错误。让我为您分解一下。
当您使用StandardScaler 作为Pipeline 中的一个步骤时,scikit-learn 将在内部为您完成这项工作。
发生的事情可以描述如下:
- 步骤0:根据您在
GridSearchCV中指定的cv参数将数据拆分为TRAINING data和TEST data。
- 第 1 步:将
scaler 安装在TRAINING data 上
- 第 2 步:
scaler 转换 TRAINING data
- 第 3 步:使用转换后的
TRAINING data 拟合/训练模型
- 第四步:
scaler 用于转换TEST data
- 第五步:训练模型
predict使用transformed TEST data
注意:您应该使用grid.fit(X, y) 和不 grid.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)