使用GridSearchCV与AdaBoost和DecisionTreeClassifier

时间:2015-08-25 17:37:50

标签: python scikit-learn decision-tree adaboost grid-search

我正在尝试使用DecisionTreeClassifier(" DTC")作为base_estimator来调整AdaBoost分类器(" ABT")。我想同时调整两个 ABT和DTC参数,但我不确定如何实现这一点 - 管道不应该工作,因为我不是"管道" DTC输出到ABT。我们的想法是在GridSearchCV估算器中迭代ABT和DTC的超参数。

如何正确指定调整参数?

我尝试了以下操作,产生了以下错误。

[IN]
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.grid_search import GridSearchCV

param_grid = {dtc__criterion : ["gini", "entropy"],
              dtc__splitter :   ["best", "random"],
              abc__n_estimators: [none, 1, 2]
             }


DTC = DecisionTreeClassifier(random_state = 11, max_features = "auto", class_weight = "auto",max_depth = None)

ABC = AdaBoostClassifier(base_estimator = DTC)

# run grid search
grid_search_ABC = GridSearchCV(ABC, param_grid=param_grid, scoring = 'roc_auc')

[OUT]
ValueError: Invalid parameter dtc for estimator AdaBoostClassifier(algorithm='SAMME.R',
      base_estimator=DecisionTreeClassifier(class_weight='auto', criterion='gini', max_depth=None,
        max_features='auto', max_leaf_nodes=None, min_samples_leaf=1,
        min_samples_split=2, min_weight_fraction_leaf=0.0,
        random_state=11, splitter='best'),
      learning_rate=1.0, n_estimators=50, random_state=11)

2 个答案:

答案 0 :(得分:24)

您发布的代码有几个问题:

  1. param_grid字典的键需要是字符串。你应该得到NameError
  2. 关键字“abc__n_estimators”应该只是“n_estimators”:你可能将它与管道语法混合在一起。这里没有任何东西告诉Python字符串“abc”代表你的AdaBoostClassifier
  3. None(而不是none)不是n_estimators的有效值。默认值(可能是您的意思)是50。
  4. 以下是包含这些修补程序的代码。 要设置Tree估算器的参数,可以使用允许访问嵌套参数的“__”语法。

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.grid_search import GridSearchCV
    
    param_grid = {"base_estimator__criterion" : ["gini", "entropy"],
                  "base_estimator__splitter" :   ["best", "random"],
                  "n_estimators": [1, 2]
                 }
    
    
    DTC = DecisionTreeClassifier(random_state = 11, max_features = "auto", class_weight = "auto",max_depth = None)
    
    ABC = AdaBoostClassifier(base_estimator = DTC)
    
    # run grid search
    grid_search_ABC = GridSearchCV(ABC, param_grid=param_grid, scoring = 'roc_auc')
    

    此外,对于AdaBoost,1或2个估算器并没有真正意义。但我猜这不是你正在运行的实际代码。

    希望这有帮助。

答案 1 :(得分:1)

试图提供一个更简短(希望是通用的)答案。


如果您想在 BaseEstimator 内对 AdaBoostClassifier 进行网格搜索,例如改变 max_depth 估计器的 min_sample_leafDecisionTreeClassifier,那么您必须在参数网格中使用特殊语法。

abc = AdaBoostClassifier(base_estimator=DecisionTreeClassifier())

parameters = {'base_estimator__max_depth':[i for i in range(2,11,2)],
              'base_estimator__min_samples_leaf':[5,10],
              'n_estimators':[10,50,250,1000],
              'learning_rate':[0.01,0.1]}

clf = GridSearchCV(abc, parameters,verbose=3,scoring='f1',n_jobs=-1)
clf.fit(X_train,y_train)

因此,请注意 'base_estimator__max_depth' 字典中的 'base_estimator__min_samples_leaf'parameters 键。这是在进行网格搜索时访问诸如 AdaBoostClassifier 之类的集成算法的 BaseEstimator 超参数的方法。特别注意 __ 双下划线符号。 parameters 中的其他两个键是常规的 AdaBoostClassifier 参数。