将 GridSearchCV 与 AdaBoost 和 DecisionTreeClassifier 结合使用
Using GridSearchCV with AdaBoost and DecisionTreeClassifier
我正在尝试使用 DecisionTreeClassifier ("DTC") 作为 base_estimator 调整 AdaBoost 分类器 ("ABT")。我想同时调整 ABT 和 DTC 参数,但不确定如何完成此操作 - 管道不应该工作,因为我不是 "piping" 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)
您发布的代码中有几处错误:
param_grid
字典的键需要是字符串。你应该得到 NameError
.
- 键 "abc__n_estimators" 应该只是 "n_estimators":您可能将其与管道语法混合在一起。这里没有任何内容告诉 Python 字符串 "abc" 代表您的
AdaBoostClassifier
.
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 来说没有实际意义。但我猜这不是你 运行.
的实际代码
希望这对您有所帮助。
尝试提供更简短(希望是通用的)答案。
如果您想在 BaseEstimator
中 进行网格搜索,例如 AdaBoostClassifier
改变 DecisionTreeClassifier
估算器的 max_depth
或 min_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
参数。
我正在尝试使用 DecisionTreeClassifier ("DTC") 作为 base_estimator 调整 AdaBoost 分类器 ("ABT")。我想同时调整 ABT 和 DTC 参数,但不确定如何完成此操作 - 管道不应该工作,因为我不是 "piping" 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)
您发布的代码中有几处错误:
param_grid
字典的键需要是字符串。你应该得到NameError
.- 键 "abc__n_estimators" 应该只是 "n_estimators":您可能将其与管道语法混合在一起。这里没有任何内容告诉 Python 字符串 "abc" 代表您的
AdaBoostClassifier
. 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 来说没有实际意义。但我猜这不是你 运行.
的实际代码希望这对您有所帮助。
尝试提供更简短(希望是通用的)答案。
如果您想在 BaseEstimator
中 进行网格搜索,例如 AdaBoostClassifier
改变 DecisionTreeClassifier
估算器的 max_depth
或 min_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
参数。