[转] AdaBoost 与决策树模型的比较

通过在随机生成的数据集上对比AdaBoost、决策树弱分类器及标准决策树模型,本文展示了AdaBoost如何通过集成多个弱分类器提高分类性能。实验结果显示,尽管单一弱分类器效果不佳,但AdaBoost在迭代25次后错误率显著下降,最终表现优于决策树。

    在 sklearn 中 AdaBoost 默认采用的是决策树模型,我们可以随机生成一些数据,然后对比下 AdaBoost 中的弱分类器(也就是决策树弱分类器)、决策树分类器和 AdaBoost 模型在分类准确率上的表现。

    如果想要随机生成数据,我们可以使用 sklearn 中的 make_hastie_10_2 函数生成二分类数据。假设我们生成 12000 个数据,取前 2000 个作为测试集,其余作为训练集。

    有了数据和训练模型后,我们就可以编写代码。我设置了 AdaBoost 的迭代次数为 200,代表 AdaBoost 由 200 个弱分类器组成。针对训练集,我们用三种模型分别进行训练,然后用测试集进行预测,并将三个分类器的错误率进行可视化对比,可以看到这三者之间的区别:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import zero_one_loss
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import  AdaBoostClassifier
# 设置 AdaBoost 迭代次数
n_estimators=200
# 使用
X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1)
# 从 12000 个数据中取前 2000 行作为测试集,其余作为训练集
test_x, test_y = X[2000:],y[2000:]
train_x, train_y = X[:2000],y[:2000]
# 弱分类器
dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
dt_stump.fit(train_x, train_y)
dt_stump_err = 1.0-dt_stump.score(test_x, test_y)
# 决策树分类器
dt = DecisionTreeClassifier()
dt.fit(train_x,  train_y)
dt_err = 1.0-dt.score(test_x, test_y)
# AdaBoost 分类器
ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators)
ada.fit(train_x,  train_y)
# 三个分类器的错误率可视化
fig = plt.figure()
# 设置 plt 正确显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
ax = fig.add_subplot(111)
ax.plot([1,n_estimators],[dt_stump_err]*2, 'k-', label=u'决策树弱分类器 错误率')
ax.plot([1,n_estimators],[dt_err]*2,'k--', label=u'决策树模型 错误率')
ada_err = np.zeros((n_estimators,))
# 遍历每次迭代的结果 i 为迭代次数, pred_y 为预测结果
for i,pred_y in enumerate(ada.staged_predict(test_x)):
     # 统计错误率
    ada_err[i]=zero_one_loss(pred_y, test_y)
# 绘制每次迭代的 AdaBoost 错误率 
ax.plot(np.arange(n_estimators)+1, ada_err, label='AdaBoost Test 错误率', color='orange')
ax.set_xlabel('迭代次数')
ax.set_ylabel('错误率')
leg=ax.legend(loc='upper right',fancybox=True)
plt.show()

    运行结果:

    从图中可以看出,弱分类器的错误率最高,只比随机分类结果略好,准确率稍微大于 50%。决策树模型的错误率明显要低很多。而 AdaBoost 模型在迭代次数超过 25 次之后,错误率有了明显下降,经过 125 次迭代之后错误率的变化形势趋于平缓。

    因此可得出,虽然单独的一个决策树弱分类器效果不好,但是多个决策树弱分类器组合起来形成的 AdaBoost 分类器,分类效果要好于决策树模型。

AdaBoost是一种基于决策树的集成学习算法,它决策树有着紧密的联系。AdaBoost属于更高级的「森林」类型的决策树,其使用的不是完整的决策树,而是特殊的决策树桩,每棵树桩仅有一个根节点和两个叶子节点 [^1]。 在AdaBoost算法里,多个这样的树桩会被组合起来形成一个强分类器。并且每个树桩的权重不同,这和随机森林中每棵树权重相同的情况不同 [^1]。AdaBoost的生成具有独特的机制,前一个树桩的错误数据会影响后一个树桩的生成,后面的树桩起到补足前面树桩的作用,这种思想被称为Boost [^1]。 从性能表现上看,弱分类器错误率较高,只比随机分类略好;决策树模型的错误率明显低于弱分类器;而AdaBoost模型在迭代次数超过25次后,错误率有明显下降,经过125次迭代后错误率变化趋于平缓 [^3]。 在特点方面,AdaBoost方法的自适应体现在前一个分类器分错的样本会被用来训练下一个分类器,对于噪声数据和异常数据比较敏感,但在一些问题中,相较于大多数其它学习算法,不容易出现过拟合现象 [^2]。 ### 代码示例 ```python from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 生成一些示例数据 X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建一个决策树桩(弱分类器) base_estimator = DecisionTreeClassifier(max_depth=1) # 创建AdaBoost分类器 ada_boost = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, random_state=42) # 训练AdaBoost模型 ada_boost.fit(X_train, y_train) # 进行预测 y_pred = ada_boost.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"AdaBoost模型的准确率: {accuracy}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值