在BaggingClassifier的参数内的参数上进行网格搜索

时间:2019-02-05 21:51:45

标签: scikit-learn random-forest grid-search ensemble-learning

这是 a question answered here的后续活动,但我认为它值得拥有自己的话题。

在上一个问题中,我们正在处理“一组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

1 个答案:

答案 0 :(得分: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)

您将参加比赛。