如何在 Adaboost 中使用一组预定义的分类器?

数据挖掘 机器学习 scikit-学习 adaboost
2021-10-15 01:28:30

假设有一些分类器如下:

dt = DecisionTreeClassifier(max_depth=DT_max_depth, random_state=0)
rf = RandomForestClassifier(n_estimators=RF_n_est, random_state=0)
xgb = XGBClassifier(n_estimators=XGB_n_est, random_state=0)
knn = KNeighborsClassifier(n_neighbors=KNN_n_neigh)
svm1 = svm.SVC(kernel='linear')
svn2 = svm.SVC(kernel='rbf')
lr = LogisticRegression(random_state=0,penalty = LR_n_est, solver= 'saga')

在 AdaBoost 中,我可以定义 abase_estimator以及估计器的数量。但是,我想使用这 7 个分类器。换句话说,n_estimators=7这些估计量高于那些估计量。我该如何定义这个模型?

2个回答

一种可能的解决方案是使用 Stacking 分类器,如下所示:

from sklearn.ensemble import StackingClassifier
# Assumed you already import  all the models you are using

dt = DecisionTreeClassifier(max_depth=DT_max_depth, random_state=0)
rf = RandomForestClassifier(n_estimators=RF_n_est, random_state=0)
xgb = XGBClassifier(n_estimators=XGB_n_est, random_state=0)
knn = KNeighborsClassifier(n_neighbors=KNN_n_neigh)
svm1 = svm.SVC(kernel='linear')
svn2 = svm.SVC(kernel='rbf')
lr = LogisticRegression(random_state=0,penalty = LR_n_est, solver= 'saga')

estimators = [
    ('rf', rf),
    ('svm1', svm1), ('svn2', svn2), ('xgb', xgb), ('knn', knn), ('lr', lr), ('dt', dt)
]

选项1:

stacker = AdaBoostClassifier()   
model = StackingClassifier(
    estimators=estimators, final_estimator= stacker
)

选项 2:

base_model = StackingClassifier(
    estimators=estimators
)
model = AdaBoostClassifier(base_estimator = base_model)

选项 2 无疑是两者中最昂贵的*,据我了解,选项 2 更适合您的需求。

  • 战略:

在此处输入图像描述

在实践中,我们从不使用您列出的任何算法作为 Adaboost 的基分类器,除了决策树

Adaboost(和类似的集成方法)是使用决策树(DTs)作为基础分类器(更具体地说,决策树桩,即深度仅为 1 的 DTs)构思的;如果您没有base_classifier在 scikit-learn 的 AdaBoost 实现中明确指定参数,那么今天仍然有一个很好的理由,它假定值为DecisionTreeClassifier(max_depth=1)( docs )。

DT 适合这种集成,因为它们本质上是不稳定的分类器(这也是它们在随机森林中作为基分类器成功的原因,而您从未听说过“随机 kNN”或“随机 SVM”);这不是 SVM、kNN 或线性模型的情况,更不用说它们本身就是集成的模型了,比如随机森林和增强树 (XGboost)。请注意传奇统计学家(和射频发明家)Leo Breiman 在Bagging Predictors的开创性论文中的以下评论:

Breiman [1994]研究了不稳定性,指出神经网络、分类和回归树以及线性回归中的子集选择是不稳定的,而k-最近邻方法是稳定的。

当用作 Adaboost 的基本分类器时,这些算法(决策树除外)预计不会提供太多功能(从另一个答案中的评论来看,您似乎已经发现了自己的东西)。仅仅因为框架(这里是 scikit-learn)表面上允许我们这样做而尝试使用它们并不是这样做的理由。

另请参阅相关的 Stack Overflow 线程: