作者:华东师大中北文艺部 | 来源:互联网 | 2022-12-09 21:53
在下面的示例中,
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()
,这也是将其应用于测试集的正确方法吗?
1> makis..:
是的,这是正确的方法,但是您的代码中有一个小错误。让我为您分解一下。
当您将StandardScaler
用作内部步骤时,Pipeline
scikit-learn将在内部为您完成这项工作。
发生的情况可以描述如下:
步骤0:数据被分成TRAINING data
并TEST 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_)
运行此代码后(调用时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)
否。如果您在整个数据集上使用“ GridSearchCV”,那么您已经在整个数据集上训练了超参数,并且不再具有用于验证模型的测试集。