【问题标题】:Using GridSearchCV with AdaBoost and DecisionTreeClassifier将 GridSearchCV 与 AdaBoost 和 DecisionTreeClassifier 一起使用
【发布时间】:2015-11-19 13:05:10
【问题描述】:

我正在尝试使用 DecisionTreeClassifier (“DTC”) 作为 base_estimator 来调整 AdaBoost 分类器 (“ABT”)。我想同时调整 both 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)

【问题讨论】:

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


    【解决方案1】:

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


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

    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)
    

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

    【讨论】:

      【解决方案2】:

      您发布的代码中有几处错误:

      1. param_grid 字典的键需要是字符串。您应该会收到 NameError
      2. 键“abc__n_estimators”应该只是“n_estimators”:您可能将它与管道语法混合在一起。这里没有任何东西告诉 Python 字符串“abc”代表你的AdaBoostClassifier
      3. None(而不是none)不是n_estimators 的有效值。默认值(可能是您的意思)是 50。

      这是包含这些修复的代码。 要设置树估算器的参数,您可以使用允许访问嵌套参数的“__”语法。

      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')
      

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

      希望这会有所帮助。

      【讨论】:

      • 第 1 点和第 3 点是转录错误,我的错!我将尝试您对指定 param_grid 语法的建议并进行报告。但是如果我理解正确的话,我可以在多个上下文中使用“__”表达式吗?我理解你关于估算器数量的观点,我首先编写了代码,看看它是否有效......很快就会更多。
      • @GPB "__" 语法也用于为管道中的(可能是嵌套的)对象指定参数。
      • @ldirer 你能解释一下你的代码是如何调整 AdaBoost 的参数的吗?我们不需要为 AdaBoost 分类器使用参数网格进行第二次网格搜索吗?