模式识别与机器学习(九):Adaboost

1.原理

AdaBoost是Adaptive Boosting(自适应增强)的缩写,它的自适应在于:被前一个基本分类器误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或预先指定的最大迭代次数再确定最后的强分类器。

1.算法步骤

首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都会被赋予相同的权值:w1 = 1/N。

训练弱分类器Ci。具体训练过程:如果某个训练样本点,被弱分类器Ci准确地分类,那么再构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值的更新过的样本被用于训练下一个弱分类器,整个过程如此迭代下去。

最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

2.算法过程

(1).首先,初始化训练集的权值分布。每个训练样本最开始都被赋予相同的权值: w i = 1 N w_{i}=\frac{1}{N} wi=N1这样样本集的权值初始分布为 D 1 ( i ) = ( w 1 , w 2 , ⋯ w N ) = ( 1 N , 1 N , ⋯ 1 N ) D_{1}(i)=(w_{1},w_{2},\cdots w_{N})=\left(\frac{1}{N},\frac{1}{N},\cdots\frac{1}{N}\right) D1(i)=(w1,w2,⋯wN)=(N1,N1,⋯N1)

(2).进行迭代 t = 1 , 2 , ⋯   , T t=1,2,\cdots,T t=1,2,⋯,T

(a).选取一个当前误差率最低的分类器h作为第t个基分类器H_t,并计算弱分类器h_t在训练集上的分类误差率: e t = ∑ i = 1 m w t , i I ( h t ( x i ) ≠ f ( x i ) ) e_{t}=\sum_{i=1}^{m}w_{t,i}I\big(h_{t}(x_{i})\neq f(x_{i})\big) et=i=1∑mwt,iI(ht(xi)=f(xi))

(b).计算该分类器在最终分类器中所占的权重:
∂ t = 1 2 ln ⁡ 1 − e t e t \partial_t=\frac{1}{2}\ln\frac{1-e_t}{e_t} ∂t=21lnet1−et

©.更新样本的权重分布:
D t + 1 = D t e x p ( − ∂ t f ( x ) h t ( x ) ) Z t D_{t+1}=\frac{D_texp(-\partial_tf(x)h_t(x))}{Z_t} Dt+1=ZtDtexp(−∂tf(x)ht(x))

其中: Z t = ∑ i = 1 m w t , i e x p ( − ∂ t f ( x i ) h t ( x i ) ) Z_t=\sum_{i=1}^mw_{t,i}exp\bigl(-\partial_tf(x_i)h_t(x_i)\bigr) Zt=i=1∑mwt,iexp(−∂tf(xi)ht(xi))

(3).最后按照弱分类器权重\partial_t组成各个弱分类器:
f ( x ) = ∑ i = 1 T ∂ i H i ( x ) \mathrm{f(x)=\sum_{i=1}^T\partial_iH_i(x)} f(x)=i=1∑T∂iHi(x)

通过符号函数sign最终得到一个强分类器:
H f i n a l = s i g n ( f ( x ) ) = s i g n ( ∑ i = 1 T ∂ i H i ( x ) ⁡ ) H_{final}=sign\big(\mathrm{f(x)}\big)=sign\bigg(\sum_{\mathrm{i}=1}^{\mathrm{T}}\partial_i\operatorname{H_i(x)}\bigg) Hfinal=sign(f(x))=sign(i=1∑T∂iHi(x))

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建AdaBoost分类器
clf = AdaBoostClassifier(n_estimators=50, learning_rate=1.0)

# 训练模型
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

# 打印预测结果
print(y_pred)

我们使用了鸢尾花数据集,这是一个常用的多类别分类数据集。我们首先加载数据,然后划分为训练集和测试集。然后,我们创建一个AdaBoost分类器,并使用训练集对其进行训练。最后,我们使用训练好的模型对测试集进行预测,并打印出预测结果。

AdaBoostClassifier的参数n_estimators表示弱学习器的最大数量,learning_rate表示学习率,这两个参数都可以根据需要进行调整。在scikit-learn的AdaBoostClassifier中,默认的弱学习器是一个最大深度为1的决策树桩。你也可以通过base_estimator参数来指定其他类型的弱学习器。

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn import svm

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建朴素贝叶斯分类器作为弱学习器的AdaBoost分类器
clf_nb = AdaBoostClassifier(base_estimator=GaussianNB(), n_estimators=50, learning_rate=1.0)
clf_nb.fit(X_train, y_train)
y_pred_nb = clf_nb.predict(X_test)
print(y_pred_nb)

# 创建SVM作为弱学习器的AdaBoost分类器
clf_svm = AdaBoostClassifier(base_estimator=svm.SVC(probability=True, kernel='linear'), n_estimators=50, learning_rate=1.0)
clf_svm.fit(X_train, y_train)
y_pred_svm = clf_svm.predict(X_test)
print(y_pred_svm)

我们首先创建了一个使用朴素贝叶斯分类器作为弱学习器的AdaBoost分类器,然后创建了一个使用SVM作为弱学习器的AdaBoost分类器。注意,对于SVM,我们需要设置probability=True,因为AdaBoost需要使用类别概率。

相关推荐
迅易科技21 分钟前
借助腾讯云质检平台的新范式,做工业制造企业质检的“AI慧眼”
人工智能·视觉检测·制造
古希腊掌管学习的神1 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI2 小时前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长2 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME3 小时前
知识库管理系统可扩展性深度测评
人工智能
海棠AI实验室4 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself4 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董5 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee5 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa5 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai