使用base_estimator功能将字典传递给sklearn分类器

时间:2018-05-24 09:43:45

标签: python dictionary scikit-learn iterable-unpacking

我正在尝试将字典传递给sklearn分类器以设置其参数,但我还想设置base_estimator个功能,例如:

>>> from sklearn.ensemble import AdaBoostClassifier
>>> x = {'n_estimators': 200}
>>> clf = AdaBoostClassifier(**x)
>>> clf
AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None,
      learning_rate=1.0, n_estimators=200, random_state=None)

工作正常,但如果我尝试:

>>> x = {'base_estimator__max_depth':5}
>>> clf = AdaBoostClassifier(**x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 
'base_estimator__max_depth'

我还尝试预先设置基本估算器,即AdaBoostClassifier(base_estimator=DecisionTreeClassifier(),**x),但这也不能与上面的错误一样。

我意识到它可以设置为clf.base_estimator__max_depth = 5但我理想情况下要解压缩设置分类器的多个参数的字典。所以我的问题是,这是可能的,如果是这样的话怎么样?

注意:我知道如何设置这些参数我想知道是否可以通过解压缩字典来实现它,因为这对我来说更好看

1 个答案:

答案 0 :(得分:1)

这是因为AdaBoostClassifier的python构造函数只在__init__()中定义了以下参数:

base_estimator=None,
n_estimators=50,
learning_rate=1.,
algorithm='SAMME.R',
random_state=None

对于它base_estimator__max_depth是一个未知参数。

但是,您可以使用set_params()根据文档正确处理它们:

  

设置此估算器的参数。

     

该方法适用于简单估计器和嵌套对象   (如管道)。后者具有形式的参数    component__parameter ,以便可以更新每个   嵌套对象的组件。

所以你可以这样做:

x = {'base_estimator__max_depth':5}
clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier())
clf.set_params(**x)

注意:在python 3中,您还可以执行以下操作(我认为您正在寻找):

x = {'base_estimator':DecisionTreeClassifier(),
     'base_estimator__max_depth':5}
clf = AdaBoostClassifier()
clf.set_params(**x)

以上内容已针对python2进行了修改,并将在下一版本中修复。请参阅issue here

另一种方法是,您始终可以先将字典设置为DecisionTreeClassifier,然后将其传递给AdaBoostClassifier。

这样的事情:

x = {'max_depth': 5}
base_est = DecisionTreeClassifier(**x)
clf = AdaBoostClassifier(base_estimator = base_est)

你还有别的想法吗?如果是,请发布您想要做的事情的完整代码段,我们可以找到方法。