首页 > 解决方案 > 使用 GridSearchCV 调整参数,但尝试拟合数据集时出错

问题描述

这是我为 Scikitlearn 机器学习做的教程。我在 Scikitlearn 中使用了 3 个不同的分类器,即决策树、逻辑回归和 KNearestNeighbors。各个分类器运行良好,我使用 MajorityVoting 将它们组合成一个集成学习算法,在代码中表示为 mv_clf。

这些是分类器的结果

10-fold cross validation: 

ROC AUC: 0.92 (+/-  0.15) [Logistic Regression]
ROC AUC: 0.87 (+/-  0.18) [Decision tree]
ROC AUC: 0.85 (+/-  0.13) [KNN]
Accuracy: 0.92 (+/-  0.15) [Logistic Regression]
Accuracy: 0.87 (+/-  0.18) [Decision tree]
Accuracy: 0.85 (+/-  0.13) [KNN]
Accuracy: 0.98 (+/-  0.05) [Majority voting]

但是,当我尝试使用 GridSearchCV 作为教程调整参数时,grid.fit() 函数出现错误。我搜索了 GridSearchCV 的文档,但我不明白为什么它不适合,因为 GridSeachCV 的输出看起来不错。

params = {'pipeline-1__clf__C': [0.001, 0.1, 100.0], 'decisiontreeclassifier__max_depth': [
    1, 2], 'pipeline-2__n_neighbors': [1, 2]}
grid = GridSearchCV(estimator=mv_clf, param_grid=params,
                    scoring='roc_auc', cv=10)
print(grid)
grid.fit(X_train, y_train)

打印(网格)函数输出

GridSearchCV(cv=10,
             estimator=VotingClassifier(estimators=[('lr',
                                                     Pipeline(steps=[['sc',
                                                                      StandardScaler()],
                                                                     ['clf',
                                                                      LogisticRegression(C=0.001,
                                                                                         random_state=1)]])),
                                                    ('dt',
                                                     DecisionTreeClassifier(criterion='entropy',
                                                                            max_depth=1,
                                                                            random_state=0)),
                                                    ('KNN',
                                                     Pipeline(steps=[['sc',
                                                                      StandardScaler()],
                                                                     ['clf',
                                                                      KNeighborsClassifier(n_neighbors=1)]]))],
                                        voting='soft'),
             param_grid={'decisiontreeclassifier__max_depth': [1, 2],
                         'pipeline-1__clf__C': [0.001, 0.1, 100.0],
                         'pipeline-2__n_neighbors': [1, 2]},
             scoring='roc_auc')

打印网格函数输出正常,但是当我尝试使用 grid.fit() 时,出现错误,我不知道为什么。

这些是调用 grid.fit() 后显示的错误

Traceback (most recent call last):
  File "/Users/cheokjiaheng/Documents/Coding Projects/Tutorials/Python Machine Learning Book/Combining Diff Models/MajorityVoting.py", line 115, in <module>
    grid.fit(X_train, y_train)
  ...
  ...
  ...
  File "/Users/cheokjiaheng/miniforge3/envs/tensorflowenv/lib/python3.8/site-packages/sklearn/base.py", line 230, in set_params
    raise ValueError('Invalid parameter %s for estimator %s. '
ValueError: Invalid parameter decisiontreeclassifier for estimator VotingClassifier(estimators=[('lr',
                              Pipeline(steps=[['sc', StandardScaler()],
                                              ['clf',
                                               LogisticRegression(C=0.001,
                                                                  random_state=1)]])),
                             ('dt',
                              DecisionTreeClassifier(criterion='entropy',
                                                     max_depth=1,
                                                     random_state=0)),
                             ('KNN',
                              Pipeline(steps=[['sc', StandardScaler()],
                                              ['clf',
                                               KNeighborsClassifier(n_neighbors=1)]]))],
                 voting='soft'). Check the list of available parameters with `estimator.get_params().keys()`.

标签: pythonscikit-learn

解决方案


这个问题在某种程度上是指这里所说的问题,是由于您在参数网格中所做的规范。在调整 a 的超参数时,您必须在后面VotingClassifier指定估计器的键(两个下划线),然后是属性本身。VotingClassfier__

但是,由于您的两个估算器是管道,您必须进一步指定步骤,该步骤再次由__(两个下划线)分隔。这意味着您的参数网格应如下所示:

param_grid={
    'dt__max_depth': [1, 2],
    'lr__clf__C': [0.001, 0.1, 100.0],
    'KNN__clf__n_neighbors': [1, 2]
}

同样,对于DecisionTreeClassifier,您只需指定实例化VotingClassifier对象时选择的名称和属性名称,对于Pipeline,您需要指定其名称、步骤和属性。


推荐阅读