提升方法(Boosting)

2020-07-13 16:30:16 浏览数 (1)

提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。

在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能

1. 提升方法AdaBoost算法

  • 思路:多个算法的判断结果综合
  • 弱学习方法容易获得,通过组合一系列弱学习方法,提升出来强学习方法
  • 大多数提升方法:改变训练数据的概率分布(权值分布)
  • 如何改变权值或概率分布:AdaBoost 的做法是,提高被前一轮弱分类器错误分类样本的权值,没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注
  • 如何将弱分类器组合:AdaBoost 采取加权多数表决的方法。 加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

AdaBoost 模型是弱分类器的线性组合:

f(x)=sum_{m=1}^{M} alpha_{m} G_{m}(x)
  • AdaBoost 算法每次迭代中,提高前一轮分类器错误分类数据的权值,降低被正确分类的数据的权值。
  • AdaBoost 将基本分类器的线性组合作为强分类器,给分类误差率小的基本分类器大的权值,给分类误差率大的基本分类器小的权值。

算法步骤

1)给每个训练样本(

x_{1},x_{2},….,x_{N}

)分配权重,初始权重

w_{1i}

均为

frac{1}{N}

2)针对带有权值的样本进行训练,得到基本分类器

G_m

(初始模型为

G1

)。

3)计算模型

G_m

的误分率

e_m=sumlimits_{i=1}^N w_{mi} I(y_inot= G_m(x_i))

4)计算模型

G_m

的系数

alpha_m=frac{1}{2} ln frac{1-e_m}{e_m}

5)根据误分率

e

和当前权重向量

w_m

更新权重向量

w_{m 1}
w_{m 1,i} = frac{w_{m,i}}{Z_m} exp (-alpha_my_iG_m(x_i))
Z_m

是规范化因子,

Z_m = sumlimits_{i=1}^M w_{m,i} exp (-alpha_my_iG_m(x_i))

6)计算组合模型

f(x)=sumlimits_{m=1}^M alpha_mG_m(x_i)

的误分率。

7)当组合模型的误分率或迭代次数低于一定阈值,停止迭代;否则,回到步骤 2)

2. AdaBoost算法训练误差分析

书上有定理证明,AdaBoost 算法能在学习的过程中,不断减少训练误差。

AdaBoost 具有适应性,即它能适应弱分类器各自的训练误差率。这也是它的名称(适应的提升)的由来,Ada是Adaptive的简写。

3. AdaBoost算法的解释

AdaBoost 算法的一个解释是该算法实际是前向分步算法的一个实现。

在这个方法里,模型是加法模型,损失函数是指数损失,算法是前向分步算法。

每一步中极小化损失函数

left(beta_{m}, gamma_{m}right)=arg min _{beta, gamma} sum_{i=1}^{N} Lleft(y_{i}, f_{m-1}left(x_{i}right) beta bleft(x_{i} ; gammaright)right)

得到参数

beta_{m}, gamma_{m}

4. 提升树

提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中最有效的方法之一。

提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。

决策树为基函数的提升方法称为提升树(boosting tree)。

5. sklearn 实例

sklearn.ensemble.AdaBoostClassifier

代码语言:javascript复制
class sklearn.ensemble.AdaBoostClassifier(base_estimator=None,
n_estimators=50, learning_rate=1.0, algorithm='SAMME.R',
 random_state=None)
  • algorithm:这个参数只有AdaBoostClassifier有。有两种Adaboost分类算法,SAMME和SAMME.R。 主要区别是弱学习器权重的度量,SAMME使用分类效果作为弱学习器权重,而SAMME.R使用预测概率大小来作为弱学习器权重。 由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。 注意使用了SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法则没有这个限制。
  • n_estimators: AdaBoostClassifier和AdaBoostRegressor都有,是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。
  • learning_rate: AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数ν
  • base_estimator:AdaBoostClassifier和AdaBoostRegressor都有,即弱分类学习器或者弱回归学习器。常用的是CART决策树或者神经网络MLP。

参考:https://github.com/fengdu78/lihang-code

代码语言:javascript复制
# -*- coding:utf-8 -*-
# @Python Version: 3.7
# @Time: 2020/3/24 23:13
# @Author: Michael Ming
# @Website: https://michael.blog.csdn.net/
# @File: AdaBoost.py
# @Reference: https://github.com/fengdu78/lihang-code
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import load_iris

data = [[0, 1, 3, -1],
        [0, 3, 1, -1],
        [1, 2, 2, -1],
        [1, 1, 3, -1],
        [1, 2, 3, -1],
        [0, 1, 2, -1],
        [1, 1, 2, 1],
        [1, 1, 1, 1],
        [1, 3, 1, -1],
        [0, 2, 1, -1]]
data = pd.DataFrame(np.array(data))
X, y = data.iloc[:, 0:-1], data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = AdaBoostClassifier(n_estimators=50, learning_rate=0.5)
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))

0 人点赞