Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将GridSearchCV与AdaBoost和DecisionTreeClassifier一起使用_Python_Scikit Learn_Decision Tree_Adaboost_Grid Search - Fatal编程技术网

Python 将GridSearchCV与AdaBoost和DecisionTreeClassifier一起使用

Python 将GridSearchCV与AdaBoost和DecisionTreeClassifier一起使用,python,scikit-learn,decision-tree,adaboost,grid-search,Python,Scikit Learn,Decision Tree,Adaboost,Grid Search,我试图使用DecisionTreeClassifier(“DTC”)作为基本估计量来调整AdaBoost分类器(“ABT”)。我想同时调整ABT和DTC参数,但不确定如何做到这一点-管道不应该工作,因为我没有将DTC的输出“管道化”到ABT。想法是在GridSearchCV估计器中迭代ABT和DTC的超参数 如何正确指定调整参数 我尝试了以下操作,在下面生成了一个错误 [IN] from sklearn.tree import DecisionTreeClassifier from sklear

我试图使用DecisionTreeClassifier(“DTC”)作为基本估计量来调整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)

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

  • 参数网格
    字典的键必须是字符串。您应该得到一个
    名称错误
  • 关键的“abc\u n\u估计器”应该是“n\u估计器”:您可能将其与管道语法混合在一起。这里没有任何东西告诉Python字符串“abc”表示您的
    AdaBoostClassifier
  • None
    (而不是
    None
    )不是
    n\u估计值的有效值。默认值(可能是您的意思)是50
  • 下面是这些修复的代码。 要设置树估计器的参数,可以使用允许访问嵌套参数的“_u”语法

    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也没有实际意义。但我猜这不是您正在运行的实际代码


    希望这能有所帮助。

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


    如果您想
    BaseEstimator
    中对
    AdaBoostClassifier
    进行网格搜索,例如改变
    DecisionTreeClassifier
    估计器的
    max\u depth
    min\u sample\u 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)
    

    因此,请注意
    参数词典中的
    基本估计量\uuu最大深度'
    基本估计量\uu最小样本\u叶'
    键。这是在进行网格搜索时访问集成算法(如
    AdaBoostClassifier
    )的BaseEstimator超参数的方法。请特别注意双下划线符号。
    参数中的其他两个键是常规的
    AdaBoostClassifier
    参数。

    第1点。三,。都是抄写错误,我的错!我将尝试您关于语法指定param_grid的建议,并向您报告。但是如果我理解正确,我可以在多个上下文中使用“_u”表达式?我理解您关于估计器数量的观点,我首先编写了此代码,看看它是否有效……不久之后。@GPB“\uuuuuu”语法还用于为管道中的对象(可能是嵌套的)指定参数。@ldier您能解释一下您的代码是如何调整AdaBoost的参数的吗?我们不需要用AdaBoost分类器的参数网格进行第二次网格搜索吗?
    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')