📅  最后修改于: 2023-12-03 14:41:39.029000             🧑  作者: Mango
在机器学习中,我们经常需要针对多个估计器进行参数调整以找出最佳模型。GridSearchCV
可以帮助我们在给定的参数空间中,对模型进行评分并找到最佳模型。本文将介绍如何使用 GridSearchCV
对多个估计器进行参数调整。
GridSearchCV
是一个用于调整模型参数的工具,其通过交叉验证来评估模型性能,并选择最佳参数组合。但是,GridSearchCV
只能对一个估计器进行参数调整。对于多个不同的估计器,我们可以使用 Pipeline
和 GridSearchCV
的组合来进行调整。
Pipeline
可以帮助我们将估计器串联在一起,把多个处理步骤看作是一个整体,方便参数调整。
例如,我们将 LinearSVC 和 SVC 进行组合,实现如下:
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC, SVC
estimators = [('LinearSVC', LinearSVC()), ('SVC', SVC())]
pipe = Pipeline(estimators)
我们创建了一个 Pipeline
对象,包含两个估计器 LinearSVC
和 SVC
。
接下来,我们可以利用 GridSearchCV
对参数进行选择。
from sklearn.model_selection import GridSearchCV
param_grid = {
'LinearSVC__C': [0.1, 1.0, 10.0],
'SVC__C': [0.1, 1.0, 10.0],
'SVC__kernel': ['linear', 'rbf']
}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
grid.fit(X, y)
在 param_grid
中,我们可以看到对应了估计器的参数,例如 LinearSVC__C
表示调整 LinearSVC
的 C 参数。同样的,SVC__C
和 SVC__kernel
分别表示对 SVC
的 C 参数和核函数(kernel)进行调整。
这里的 pipe
对象将 LinearSVC
和 SVC
串联在一起,所以我们可以直接对整个 pipe
进行 GridSearchCV
。同时,参数调整时需要加上估计器的名称,用双下划线进行连接。
我们使用 sklearn 自带的手写数字数据集进行演示。
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.svm import LinearSVC, SVC
# Load digits dataset
X, y = load_digits(return_X_y=True)
# Create pipeline with estimators
estimators = [
('pca', PCA()),
('classifiers', [
LogisticRegression(),
LinearSVC(),
SVC(),
RandomForestClassifier()
])
]
pipe = Pipeline(estimators)
# Set parameter grid for GridSearchCV
param_grid = {
'pca__n_components': [10, 20, 30],
'classifiers__LogisticRegression__C': [0.1, 1.0, 10.0],
'classifiers__LinearSVC__C': [0.1, 1.0, 10.0],
'classifiers__SVC__C': [0.1, 1.0, 10.0],
'classifiers__SVC__kernel': ['linear', 'rbf'],
'classifiers__RandomForestClassifier__n_estimators': [10, 20, 30]
}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
grid.fit(X, y)
print('Best score:', grid.best_score_)
print('Best params:', grid.best_params_)
在上述代码中,我们创建了一个包含 PCA 和 LogisticRegression、LinearSVC、SVC 以及 RandomForestClassifier 四个估计器的 Pipeline
对象。之后,我们指定了各个估计器的参数空间,包含 PCA 的主成分数量 n_components
,各个估计器的 C
参数,SVC 的 kernel
参数以及 RandomForestClassifier 的 n_estimators
参数。
在 GridSearchCV
中,我们设置了 cv=5
表示使用 5 折交叉验证评估模型,同时通过 param_grid
指定了需要进行参数搜索的参数空间。
最后,我们输出了最佳得分和参数。这里的最佳参数是一个嵌套字典,我们可以通过 grid.best_params_['classifiers']['LogisticRegression']['C']
的方式获得最佳 LogisticRegression 的 C 参数,以此类推。
本文介绍了如何使用 GridSearchCV
对多个估计器进行参数调整。我们首先使用 Pipeline
将估计器串联在一起,然后通过 GridSearchCV
搜索估计器的参数空间。通过这种方式,我们可以方便地对多个估计器进行快速调参,提高模型性能。