Python 将GridSearchCV与AdaBoost和DecisionTreeClassifier一起使用
我试图使用DecisionTreeClassifier(“DTC”)作为基本估计量来调整AdaBoost分类器(“ABT”)。我想同时调整ABT和DTC参数,但不确定如何做到这一点-管道不应该工作,因为我没有将DTC的输出“管道化”到ABT。想法是在GridSearchCV估计器中迭代ABT和DTC的超参数 如何正确指定调整参数 我尝试了以下操作,在下面生成了一个错误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
[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)
您发布的代码中有几处错误:
参数网格
字典的键必须是字符串。您应该得到一个名称错误
AdaBoostClassifier
None
(而不是None
)不是n\u估计值的有效值。默认值(可能是您的意思)是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也没有实际意义。但我猜这不是您正在运行的实际代码
希望这能有所帮助。尝试提供一个简短(希望是通用)的答案。
如果您想在
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')