python - 使用 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()`.
解决方案
这个问题在某种程度上是指这里所说的问题,是由于您在参数网格中所做的规范。在调整 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
,您需要指定其名称、步骤和属性。
推荐阅读
- tabs - 如何在 peoplesoft 中更改网格选项卡样式
- python - 用 0 或 1 更新 txt 文件中的列名
- python-3.x - 在字典中连接多个 Numpy 数组
- python - pandas - 合并和总结几乎重复的行
- identityserver4 - Identityserver 4 自省在注销后将令牌状态显示为活动
- python - 将屏幕像素坐标转换为 PTZ 摄像机平移和倾斜角度 (Pelco-D)
- javascript - 为什么我不在 fullpage.js 中的 setAllowScrolling=false 之后在导航栏中使用 Scroll?
- c# - 将 Grid 放到列表框 WPF 的第一项
- java - Maven 使用 org.apache.cxf:cxf-java2ws-plugin:3.3.0:java2ws 构建:参数列表太长
- r - 是否有任何 R 函数来替换列中因子的“部分”?