GPB*_*GPB 24 python decision-tree adaboost scikit-learn 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)
Run Code Online (Sandbox Code Playgroud)
ldi*_*rer 27
您发布的代码中存在一些错误:
param_grid字典的键需要是字符串.你应该得到一个NameError.AdaBoostClassifier.None(而不是none)不是有效值n_estimators.默认值(可能是你的意思)是50.这是带有这些修复的代码.要设置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')
Run Code Online (Sandbox Code Playgroud)
此外,1或2个估算器对AdaBoost来说并没有多大意义.但我猜这不是你正在运行的实际代码.
希望这可以帮助.
小智 6
尝试提供一个更短(并且希望通用)的答案。
如果您想在 a 内进行网格搜索,BaseEstimator例如AdaBoostClassifier改变估计器的max_depthor ,那么您必须在参数网格中使用特殊语法。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)
Run Code Online (Sandbox Code Playgroud)
因此,请记下字典中的'base_estimator__max_depth'和'base_estimator__min_samples_leaf'parameters键。这是访问集成算法的 BaseEstimator 超参数的方法,就像AdaBoostClassifier进行网格搜索时一样。__特别注意双下划线符号。中的其他两个键parameters是常规AdaBoostClassifier参数。