如何为Pipeline传参并给AdaBoost基学习器DecisionTree设置多组ccp_alpha
问题原因
你之前的写法不生效是因为GridSearchCV只能识别参数网格字典顶层的参数路径规则,你直接把ccp_alpha的候选列表写到DecisionTreeClassifier()的实例化参数里,网格搜索无法识别和遍历这个嵌套的参数值,会直接把整个列表当成一个固定的ccp_alpha取值传入,自然达不到调参的效果。
正确实现方案
你可以把AdaBoost使用不同基分类器的场景拆成两个独立的参数网格块,分开配置参数:
- 针对基分类器为SVC的AdaBoost,仅配置学习率等公共参数
- 针对基分类器为DecisionTreeClassifier的AdaBoost,额外增加
mdl__base_estimator__ccp_alpha的参数路径来传入ccp_alpha的候选值
另外注意如果用SVC作为AdaBoost的基分类器,需要给SVC设置probability=True开启概率输出,否则AdaBoost无法正常训练。同时你的原有代码存在变量名、参数取值不合法的小问题,修正后的完整代码如下:
import numpy as np from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV pipeline = Pipeline( [ ('scal', StandardScaler()), ('mdl', 'passthrough') ] ) _parameters = [ # 单独调优DecisionTreeClassifier { 'mdl': [DecisionTreeClassifier(random_state=42)], 'mdl__max_depth': np.linspace(2, 30, 2).astype(int), 'mdl__min_samples_split': np.linspace(2, 10, 1).astype(int), # 原取值1不合法,最小为2 'mdl__max_features': np.linspace(1, 100, 1).astype(int), 'mdl__ccp_alpha': np.linspace(0, 1, 10) }, # 调优基分类器为SVC的AdaBoost { 'mdl': [AdaBoostClassifier(random_state=23)], 'mdl__learning_rate': np.linspace(0, 1, 20), 'mdl__base_estimator': [SVC(probability=True)] # 必须开启probability参数 }, # 调优基分类器为DecisionTree的AdaBoost,单独配置ccp_alpha { 'mdl': [AdaBoostClassifier(random_state=23)], 'mdl__learning_rate': np.linspace(0, 1, 20), 'mdl__base_estimator': [DecisionTreeClassifier()], 'mdl__base_estimator__ccp_alpha': [0.3, 0.4, 0.5, 0.7] } ] grid_search = GridSearchCV(pipeline, _parameters, cv=3, n_jobs=-1, scoring='f1') grid_search.fit(x, y)
内容的提问来源于stack exchange,提问作者Lijin Durairaj
相关产品推荐
相关产品推荐

