对 BaggingClassifier 参数内的参数进行网格搜索

Posted

技术标签:

【中文标题】对 BaggingClassifier 参数内的参数进行网格搜索【英文标题】:Grid search on parameters inside the parameters of a BaggingClassifier 【发布时间】:2019-06-29 19:33:49 【问题描述】:

这是对 a question answered here 的跟进,但我相信它值得拥有自己的主题。

在上一个问题中,我们处理的是“Ensemble of Ensemble 分类器,其中每个分类器都有自己的参数”。让我们从MaximeKan在他的回答中提供的例子开始:

my_est = BaggingClassifier(RandomForestClassifier(n_estimators = 100, bootstrap = True, 
      max_features = 0.5), n_estimators = 5, bootstrap_features = False, bootstrap = False, 
      max_features = 1.0, max_samples = 0.6 )

现在说我想再上一层:抛开效率、计算成本等考虑因素,作为一个一般概念:我将如何使用这种设置运行网格搜索?

我可以按照这些思路设置两个参数网格:

BaggingClassifier

BC_param_grid = 
'bootstrap': [True, False],
'bootstrap_features': [True, False],    
'n_estimators': [5, 10, 15],
'max_samples' : [0.6, 0.8, 1.0]

还有一个RandomForestClassifier

RFC_param_grid = 
'bootstrap': [True, False],    
'n_estimators': [100, 200, 300],
'max_features' : [0.6, 0.8, 1.0]

现在我可以用我的估算器调用网格搜索:

grid_search = GridSearchCV(estimator = my_est, param_grid = ???)

在这种情况下我该如何处理param_grid 参数?或者更具体地说,如何使用我设置的两个参数网格?

不得不说,感觉就像在玩matryoshka dolls。

【问题讨论】:

我建议尝试这里推荐的方法:***.com/questions/47570307/…。显然,把base_estimator__<param name> = [...],即。 base_estimator__max_depth = [...] 在您的 param_grid 中足以告诉 GridSearchCV 该特定参数列表用于您的基本估计器的超参数之一(在您的情况下为 RandomForestClassifier)。 @James Dellinger - 谢谢,成功了!我听从了你的建议并从那里扩展。为了我们的子孙后代,我将发布最终版本作为答案... 【参考方案1】:

按照上面的@James Dellinger 评论,并从那里扩展,我能够完成它。事实证明,“秘密酱汁”确实是一个几乎没有记录的功能 - __ (双下划线)分隔符(在 Pipeline 文档中有一些传递引用):似乎添加了内部/基本估计器名称,后跟这个 __ 到内部/基本估计器参数的名称,允许您创建一个 param_grid 涵盖外部和内部估计器的参数。

因此,对于问题中的示例,外部估计器是 BaggingClassifier,内部/基本估计器是 RandomForestClassifier。所以你需要做的是,首先,导入需要导入的内容:

from sklearn.ensemble import BaggingClassifier, RandomForestClassifier
from sklearn.model_selection import GridSearchCV

随后是 param_grid 分配(在这种情况下,问题中的示例):

param_grid = 
 'bootstrap': [True, False],
 'bootstrap_features': [True, False],    
 'n_estimators': [5, 10, 15],
 'max_samples' : [0.6, 0.8, 1.0],
 'base_estimator__bootstrap': [True, False],    
 'base_estimator__n_estimators': [100, 200, 300],
 'base_estimator__max_features' : [0.6, 0.8, 1.0]

最后,您的网格搜索:

grid_search=GridSearchCV(BaggingClassifier(base_estimator=RandomForestClassifier()), param_grid=param_grid, cv=5)

你要去参加比赛了。

【讨论】:

以上是关于对 BaggingClassifier 参数内的参数进行网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

RandomForestClassifier 与 BaggingClassifier 不同

在 BaggingClassifier 中绘制准确度历史

BaggingClassifier 和具有分类特征的 CatBoost 无法正常工作

LR部分参数设置

使用 BaggingClassifier 时打印决策树和 feature_importance

将 sklearn 的 BaggingClassifier 与 GridSearchCV 一起使用时出现 ZeroDivisionError