前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习十大经典算法之AdaBoost

机器学习十大经典算法之AdaBoost

作者头像
墨明棋妙27
发布2022-09-23 11:22:19
4910
发布2022-09-23 11:22:19
举报
文章被收录于专栏:1996

集成学习Boosting

集成学习大致可分为两大类:BaggingBoosting。Bagging一般使用强学习器,其个体学习器之间不存在强依赖关系,容易并行。Boosting则使用弱分类器,其个体学习器之间存在强依赖关系,是一种序列化方法。Bagging主要关注降低方差,而Boosting主要关注降低偏差。Boosting是一族算法,其主要目标为将弱学习器“提升”为强学习器,大部分Boosting算法都是根据前一个学习器的训练效果对样本分布进行调整,再根据新的样本分布训练下一个学习器,如此迭代M次,最后将一系列弱学习器组合成一个强学习器。而这些Boosting算法的不同点则主要体现在每轮样本分布的调整方式上。

AdaBoost原理简介

AdaBoost算法是Adaptive Boost的简称,Boosting通过将一系列弱学习器组合起来,通过集成这些弱学习器的学习能力,得到一个强学习器。具体到AdaBoost算法,AdaBoost在之前学习器的基础上改变样本的权重,增加那些之前被分类错误的样本的比重,降低分类正确样本的比重,这样之后的学习器将重点关注那些被分类错误的样本。最后通过将这些学习器通过加权组合成一个强学习器,具体的,分类正确率高的学习器权重较高,分类正确率低的学习器权重较低。

AdaBoost 算法流程

  • 输入:训练集
D=((x_1,y_1),(x_2,y_2),...,(x_m,y_m))

,训练轮数T,和一个基学习算法L。

  • 首先,让所有数据的权重都为
D_1(x) = \frac{1}{m}

  • 然后,对于每一轮的train过程,得到一个基学习器
h_t = L(D,D_t)

  • 计算这个基学习器
h_t

在训练数据集D上的误差

\epsilon_t = P_{x\sim D_t}(h_t(x)\ne f(x))

  • 如果这个误差大于0.5,那么直接停止本轮的train,进行下一轮;
  • 计算此轮基学习器在最终的模型中所占的权重
\alpha_t=\frac{1}{2}ln \frac{1-\epsilon_t}{\epsilon_t}

  • 对于在这一轮基学习器中做错的样本和做对的样本进行调整:
D_{t+1}(x) = \frac{D_t(x)}{Z_t}exp(-\alpha_tf(x)h_t(x))

  • 上述中的
Z_t

是一个规范化因子;一般

Z^{(m)}=\sum_{i=1}^{N}\omega^{(m)}ie^{-y_{i}\alpha_{m}G_{m}(x_{i})}

,以确保所有的

\omega^{(m+1)}

构成一个分布;

  • 最终,得到ensemble后的model为
H(x)=sign(\sum_{t=1}^T\alpha_th_t(x))

最后一步的模型Ensemble如下图所示,前面的数字表示

\alpha(t)

,后面表示学习到的三个基学习器。

动手实践

在 Python 环境下使用 Adaboost 进行手写数字识别。

代码语言:javascript
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import train_test_split
from sklearn.model_selection import learning_curve

from sklearn.datasets import load_digits

首先,载入数据

代码语言:javascript
复制
dataset = load_digits()
X = dataset['data']
y = dataset['target']

X 包含长度为 64 的数组,它们代表了简单的 8x8 的平面图像。使用该数据集的目的是为了完成手写数字识别任务。下图为一个给定的手写数字的示例:

如果我们坚持使用深度为 1 的决策树分类器(决策树桩),以下是如何在这种情况下实现 AdaBoost 分类器:

代码语言:javascript
复制
reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1))
scores_ada = cross_val_score(reg_ada, X, y, cv=6)
scores_ada.mean()

这样得到的分类准确率的结果应该约为 26%,还具有很大的提升空间。其中一个关键的参数是序列决策树分类器的深度。那么,决策树的深度如何变化才能提高分类准确率呢?

代码语言:javascript
复制
core = []
for depth in [1,2,10] :
    reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=depth))
    scores_ada = cross_val_score(reg_ada, X, y, cv=6)
    score.append(scores_ada.mean())

在这个简单的例子中,当决策树的深度为 10 时,分类器得到了最高的分类准确率 95.8%。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机视觉CV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集成学习Boosting
  • AdaBoost原理简介
  • AdaBoost 算法流程
  • 动手实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档