跳至主要内容

Python 中的 AdaBoost 分类器

理解集成方法、AdaBoost 算法的工作原理,并学习在 Python 中构建 AdaBoost 模型。
· 8分钟 阅读

使用 AI 探索

近年来,提升(boosting)算法在数据科学或机器学习竞赛中备受追捧。大多数竞赛冠军都会使用提升算法来获得更高的准确率。这类数据科学竞赛为学习、探索以及为各类商业与政府问题提供解决方案搭建了全球性平台。提升算法将多个准确率较低(或称弱)模型组合,构建出准确率较高(或称强)的模型。它可广泛应用于信贷、保险、市场营销与销售等领域。诸如 AdaBoost、梯度提升(Gradient Boosting)与 XGBoost 等提升算法,是赢得数据科学竞赛的常用机器学习方法。在本教程中,您将学习集成中的提升算法 AdaBoost,内容包括:

集成式机器学习方法

集成(Ensemble)是复合模型,通过组合一系列表现一般的分类器,以期得到更优的分类器。每个个体分类器进行投票,最终预测标签采用多数投票结果。与单个或基分类器相比,集成通常能提供更高的准确率。集成方法可通过将各个基学习器分配到不同机器上实现并行化。简单来说,集成学习方法是将多种机器学习方法组合成单一预测模型以提升性能的元算法。集成方法可通过装袋(bagging)降低方差,通过提升(boosting)降低偏差,或通过堆叠(stacking)改进预测。

Ensemble Machine Learning Approach
  1. Bagging 是自助聚合(bootstrap aggregation)的简称。它通过组合多个学习器来降低估计的方差。以随机森林为例,它训练 M 棵决策树,您可以在数据的不同随机子集上训练 M 棵不同的树,并通过投票得到最终预测。常见的装袋集成方法有随机森林(Random Forest)与极端随机树(Extra Trees)。

  2. 提升算法将一组准确率较低的分类器组合为一个高准确率的分类器。低准确率(或弱)分类器的精度好于随机猜测;高准确率(或强)分类器的错误率接近 0。提升算法会关注前一轮中预测错误的样本。提升算法通常不易过拟合。以下三种算法在数据科学竞赛中极为流行:

    • AdaBoost(自适应提升)
    • 梯度树提升(Gradient Tree Boosting)
    • XGBoost
  3. Stacking(或堆叠泛化)是一种集成学习技术,将多个基分类模型的预测组合成一个新的数据集。这个新数据集再作为另一分类器的输入,由该分类器来完成最终学习。Stacking 常被称为 blending(融合法)。

Ensemble Machine Learning Approach

按基学习器的生成方式,集成方法可分两类:并行式集成方法中,基学习器并行生成,例如随机森林;顺序式集成方法中,基学习器按顺序生成,例如 AdaBoost。

按基学习器的类型,集成方法可分两类:同质集成方法在每次迭代中使用相同类型的基学习器;异质集成方法在每次迭代中使用不同类型的基学习器。

AdaBoost 分类器

AdaBoost(自适应提升)是 Yoav Freund 与 Robert Schapire 于 1996 年提出的一种集成式提升分类器。它通过组合多个分类器来提升整体准确率。AdaBoost 是一种迭代式集成方法。AdaBoost 分类器通过组合多个表现较差的分类器,构建出一个高准确率的强分类器。其基本思想是在每次迭代中为分类器与训练样本设置权重,从而尽可能准确地预测异常观测。只要某个机器学习算法在训练集上能接收样本权重,它就可以作为基分类器。AdaBoost 需满足两点:

  1. 分类器需在不同加权的训练样本上进行交互式训练。
  2. 在每次迭代中,通过最小化训练误差来尽可能拟合这些样本。

AdaBoost 算法如何工作?

其流程如下:

  1. 初始阶段,AdaBoost 随机选择一个训练子集。
  2. 随后,依据上一轮的预测准确性来选择训练集,迭代训练 AdaBoost 模型。
  3. 对被错误分类的观测赋予更高权重,使其在下一次迭代中被更大概率地正确分类。
  4. 同时,根据分类器的准确率在每次迭代中为其分配权重。越准确的分类器权重越高。
  5. 该过程迭代进行,直到整个训练数据被无误拟合,或达到预设的最大基学习器数量为止。
  6. 预测时,对所有已训练的学习器进行“投票”。
How does the AdaBoost algorithm work?

在 Python 中构建模型

导入所需库

我们先加载所需的库。

# Load libraries
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
# Import train_test_split function
from sklearn.model_selection import train_test_split
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics

加载数据集

在模型构建部分,您可以使用著名的多分类问题 IRIS(鸢尾花)数据集。该数据集包含 4 个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)和一个目标(花的类别)。共有三类花:山鸢尾(Setosa)、变色鸢尾(Versicolour)与维吉尼亚鸢尾(Virginica)。数据集可在 scikit-learn 库中直接获取,也可从 UCI 机器学习库下载。

# Load data
iris = datasets.load_iris()
X = iris.data
y = iris.target

划分数据集

为评估模型表现,将数据集划分为训练集与测试集是一种良好做法。

使用 train_test_split() 函数来划分数据集。您需要传入 3 个参数:特征、目标以及测试集大小。

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test

构建 AdaBoost 模型

使用 Scikit-learn 创建 AdaBoost 模型。AdaBoost 默认使用决策树分类器作为基分类器。

# Create adaboost classifer object
abc = AdaBoostClassifier(n_estimators=50,
                         learning_rate=1)
# Train Adaboost Classifer
model = abc.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = model.predict(X_test)

“最重要的参数是 base_estimator、n_estimators 和 learning_rate。” (Adaboost Classifier,Chris Albon)

  • base_estimator:用于训练模型的弱学习器。默认使用 DecisionTreeClassifier 作为弱学习器。您也可以指定其他机器学习算法。
  • n_estimators:迭代训练的弱学习器数量。
  • learning_rate:用于调节弱学习器权重的学习率。默认值为 1。

评估模型

我们来估计分类器(或模型)预测品种类型的准确程度。

可通过对比测试集的真实值与预测值来计算准确率。

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.8888888888888888

得到 88.88% 的准确率,可视为较好的结果。

如需进一步评估,您也可以使用不同的基学习器来创建模型。

使用不同的基学习器

这里使用了 SVC 作为基学习器。只要能够接收样本权重,任何机器学习算法都可作为基学习器,例如决策树、支持向量分类器等。

# Load libraries
from sklearn.ensemble import AdaBoostClassifier

# Import Support Vector Classifier
from sklearn.svm import SVC
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
svc=SVC(probability=True, kernel='linear')

# Create adaboost classifer object
abc =AdaBoostClassifier(n_estimators=50, base_estimator=svc,learning_rate=1)

# Train Adaboost Classifer
model = abc.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = model.predict(X_test)


# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.9555555555555556

得到 95.55% 的分类准确率,表现良好。

在该示例中,使用 SVC 作为基学习器的准确率优于使用决策树作为基学习器。

优点

AdaBoost 易于实现。它通过迭代地纠正弱分类器的错误,并将多个弱学习器组合来提升准确率。您可以在 AdaBoost 中使用多种基分类器。AdaBoost 不易过拟合。这一点可在实验结果中观察到,但尚无明确理论解释。

缺点

AdaBoost 对噪声数据较为敏感。由于尝试完美拟合每个样本,它容易受到离群点影响。与 XGBoost 相比,AdaBoost 训练更慢。

总结

恭喜您读到本教程的结尾!

在本教程中,您学习了集成式机器学习方法、AdaBoost 算法、其工作机制,以及使用 Python 的 Scikit-learn 进行模型构建与评估,并讨论了其优缺点。

欢迎提出反馈或问题。您可以留言提问,我会尽力解答。

如果您希望进一步学习 Python 中的机器学习,欢迎查看 DataCamp 的使用 XGBoost 的极端梯度提升课程以及Python 机器学习:Scikit-Learn 教程。

主题