📜  gridsearchcv 多个估计器 (1)

📅  最后修改于: 2023-12-03 14:41:39.029000             🧑  作者: Mango

GridSearchCV 多个估计器

在机器学习中,我们经常需要针对多个估计器进行参数调整以找出最佳模型。GridSearchCV 可以帮助我们在给定的参数空间中,对模型进行评分并找到最佳模型。本文将介绍如何使用 GridSearchCV 对多个估计器进行参数调整。

概述

GridSearchCV 是一个用于调整模型参数的工具,其通过交叉验证来评估模型性能,并选择最佳参数组合。但是,GridSearchCV 只能对一个估计器进行参数调整。对于多个不同的估计器,我们可以使用 PipelineGridSearchCV 的组合来进行调整。

Pipeline 可以帮助我们将估计器串联在一起,把多个处理步骤看作是一个整体,方便参数调整。

例如,我们将 LinearSVC 和 SVC 进行组合,实现如下:

from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC, SVC

estimators = [('LinearSVC', LinearSVC()), ('SVC', SVC())]
pipe = Pipeline(estimators)

我们创建了一个 Pipeline 对象,包含两个估计器 LinearSVCSVC

接下来,我们可以利用 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__CSVC__kernel 分别表示对 SVC 的 C 参数和核函数(kernel)进行调整。

这里的 pipe 对象将 LinearSVCSVC 串联在一起,所以我们可以直接对整个 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 搜索估计器的参数空间。通过这种方式,我们可以方便地对多个估计器进行快速调参,提高模型性能。