使用 scikit-learn 进行递归特征消除和网格搜索:DeprecationWarning

Posted

技术标签:

【中文标题】使用 scikit-learn 进行递归特征消除和网格搜索:DeprecationWarning【英文标题】:Recursive Feature Elimination & Grid Search using scikit-learn: DeprecationWarning 【发布时间】:2016-06-30 02:28:23 【问题描述】:

我正在构建多个分类器的网格搜索,并希望使用递归特征消除和交叉验证。我从Recursive feature elimination and grid search using scikit-learn 中提供的代码开始。以下是我的工作代码:

param_grid = ['C': 0.001, 'C': 0.01, 'C': .1, 'C': 1.0, 'C': 10.0,
              'C': 100.0, 'fit_intercept': True, 'fit_intercept': False,
              'penalty': 'l1', 'penalty': 'l2']

estimator = LogisticRegression()
selector = RFECV(estimator, step=1, cv=5, scoring="roc_auc")
clf = grid_search.GridSearchCV(selector, "estimator_params": param_grid,
                               cv=5, n_jobs=-1)
clf.fit(X,y)
print clf.best_estimator_.estimator_
print clf.best_estimator_.ranking_
print clf.best_estimator_.score(X, y)

我收到了一个 DeprecationWarning,因为它似乎在 0.18 中删除了“estimator_params”参数;我正在尝试找出在第 4 行中使用的正确语法。

正在尝试...

param_grid = ['C': 0.001, 'C': 0.01, 'C': .1, 'C': 1.0, 'C': 10.0,
              'C': 100.0, 'fit_intercept': True, 'fit_intercept': False,
              'fit_intercept': 'l1', 'fit_intercept': 'l2']
clf = grid_search.GridSearchCV(selector, param_grid,
                               cv=5, n_jobs=-1)

返回 ValueError:参数值应该是一个列表。还有……

param_grid = "penalty": ["l1","l2"],
           "C": [.001,.01,.1,1,10,100],
           "fit_intercept": [True, False]
clf = grid_search.GridSearchCV(selector, param_grid,
                               cv=5, n_jobs=-1)

返回 ValueError:估计器 RFECV 的参数惩罚无效。使用estimator.get_params().keys() 检查可用参数列表。检查键将“C”、“fit_intercept”和“penalty”中的所有 3 个显示为参数键。正在尝试...

param_grid = "estimator__C": [.001,.01,.1,1,10,100],
              "estimator__fit_intercept": [True, False],
              "estimator__penalty": ["l1","l2"]
clf = grid_search.GridSearchCV(selector, param_grid,
                               cv=5, n_jobs=-1)

永远不会完成执行,所以我猜不支持这种类型的参数分配。

就目前而言,我已设置为忽略警告,但我想使用 0.18 的适当语法更新代码。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

回答之前在 SO 上发布的问题:https://***.com/a/35560648/5336341。感谢Paulo Alves 的回答。

相关代码:

params = 'estimator__max_depth': [1, 5, None],
          'estimator__class_weight': ['balanced', None]
estimator = DecisionTreeClassifier()
selector = RFECV(estimator, step=1, cv=3, scoring='accuracy')
clf = GridSearchCV(selector, params, cv=3)
clf.fit(X_train, y_train)
clf.best_estimator_.estimator_

要查看更多信息,请使用:

print(selector.get_params())

【讨论】:

以上是关于使用 scikit-learn 进行递归特征消除和网格搜索:DeprecationWarning的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 对 SVR 进行递归特征消除和网格搜索

在 scikit-learn 中结合递归特征消除和网格搜索

GPU 上的 SKLearn RFE(递归特征消除)

Scikit-learn 中的特征选择遇到了混合变量类型的问题

如何在 R 中使用 SVM 进行递归特征消除

使用RFECV递归特征消除 (Recursive Feature Elimination)进行特征筛选详解及实战