【问题标题】:Is it possible to set base_estimator as OneVsRestClassifier(DecisionTreeClassifier()) for Adaboost?是否可以将 base_estimator 设置为 Adaboost 的 OneVsRestClassifier(DecisionTreeClassifier())?
【发布时间】:2019-07-31 05:19:00
【问题描述】:

我正在尝试在具有年龄组和种族组的多类标签的数据集上构建 Adaboost 模型。

因为我计划获得 ROC 和 AUC,所以我将目标变量二值化为年龄组的 yb_train2 和种族组的 yb_train3。然后我在决策树模型中尝试了 one-vs-rest,效果很好。

但现在我不知道如何在网格搜索中指定参数,我尝试了以下代码,并得到一个语法错误:

abc = AdaBoostClassifier(base_estimator= (OneVsRestClassifier(DecisionTreeClassifier()))


param_grid = dict(base_estimator__estimator__criterion = ["gini", "entropy"],
                  base_estimator__estimator__splitter = ["best", "random"],
                  n_estimators = [1, 2],
                  learning_rate =  [0.0001,0.001,0.01,0.1,1]
                  )

grid = GridSearchCV(abc,param_grid)

grid.fit(X_train,yb_train2)
print ('best score: {:}').format(grid.best_score_ ), ('with parameter: {:}').format(grid.best_params_)

grid.fit(X_train,yb_train3)
print ('best score: {:}').format(grid.best_score_ ), ('with parameter:{:}').format(grid.best_params_)

有人可以在这种情况下提出一些建议吗?谢谢:)

【问题讨论】:

    标签: python machine-learning scikit-learn grid-search adaboost


    【解决方案1】:

    您错过了关闭括号之一。

    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.multiclass import OneVsRestClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import GridSearchCV
    
    abc = AdaBoostClassifier(base_estimator= (OneVsRestClassifier(DecisionTreeClassifier())))
    
    param_grid = dict(base_estimator__estimator__criterion = ["gini", "entropy"],
                      base_estimator__estimator__splitter = ["best", "random"],
                      n_estimators = [1, 2],
                      learning_rate =  [0.0001,0.001,0.01,0.1,1]
                      )
    
    grid = GridSearchCV(abc,param_grid)      
    

    这可以帮助您克服语法错误。

    但 DecisionTreeClassifier 默认是多类分类器,因此我建议不要在其上使用 oneVsRestclassifier 包装器。

    【讨论】:

    • 谢谢兄弟,解决了这个问题。但仍无法输入二值化多类数据。在我将网格拟合到具有 5 个类的数据后,它将返回 'ValueError: bad input shape (72, 5)'。我应该做 OneRestClassifer(Adaboost()) 而不是把 Adaboost() 放在括号外吗?但是如何为每个指定参数?我的天啊!!这太复杂了.. 但无论如何,感谢您对修复的帮助。
    • 我的意思是您不必对多类数据进行二值化。您可以直接将其提供给 decisionTreeClassifier 或 Adaboost
    • 因为我使用 ROC 作为我所有模型的分类指标,因为 ROC 需要对数据进行二值化,所以这就是我试图找出这个问题的原因
    猜你喜欢
    • 2015-11-19
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2018-06-17
    • 2013-06-29
    相关资源
    最近更新 更多