文章目录
提升学习与集成方法
Boosting
基本概念
强可学习和弱可学习
强可学习”是指:在概率近似正确(probably approximately correct, PCA)学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高。而如果在PAC学习框架中,如果存在一个多项式的学习算法能够学习这个概念,但是学习的正确率仅比随机猜想略好,那么称之为“弱可学习”。
事实证明,在PCA学习的框架下,一个概念是强可学习的充分必要条件是该概念是弱可学习的。因此,我们对于一个复杂的学习问题,可以先构造简单的“弱学习算法”,然后再想办法把“弱学习算法”提升为“强学习算法”
提升算法的两个关键
以分类问题为例,给定一个训练集,发现较为粗糙的分类规则(弱分类器)比发现精确的分类规则(强分类器)要容易很多。提升方法就是从弱学习方法出发,反复学习可以得到一系列的弱分类器,然后把这些弱分类器组合起来,构成一个强分类器。因此,提升方法需要解决两个关键问题是:如何学习一系列的弱分类器和如何把这些弱分类器组合成一个强分类器。
1.对于问题一,大多数提升方法都是通过改变训练数据的概率分布(训练数据的权值分布),对于不同的训练数据分布执行弱学习算法来学习一系列的弱分类器。
2.对于问题二,不同的提升方法采取不同的方式,如平均法、投票法、学习法等。其中AdaBoost采取加权多数表决的方法,即加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用。
Boosting具体步骤
Boosting主要思想就是将弱的基学习器提升(boost)为强学习器,其具体步骤如下:
1.先用每个样本权重相等的训练集训练一个初始的基学习器。
2.根据上轮得到的学习器对训练集的预测表现情况调整训练集中的样本权重(例如提高被错分类的样本的权重使之在下轮训练中得到更多的关注), 然后据此训练一个新的基学习器。
3.重复2直到得到
M
M
M个基学习器,最终的集成结果是
M
M
M个基学习器的组合。
AdaBoost
AdaBoost的基本思想
Boosting算法是一个串行的过程,Boosting算法簇中最著名的就是AdaBoost。
针对如何调整每一轮的训练集中的样本权重,如何将得到的
M
M
M个基学习器组合成最终的学习器这两个问题,AdaBoost(Adaptive Boosting, 自适应增强)算法采取的方法是:
1.提高上一轮被错误分类的样本的权值,降低被正确分类的样本的权值。
2.线性加权求和。使得误差率小的基学习器拥有较大的权值,误差率大的基学习器拥有较小的权值
这是AdaBoost的算法结构图,具体的算法步骤由于每个人的数学基础不一样,我基本上看得不是很懂。
AdaBoost的算法步骤
考虑如下形式的二分类训练数据集(标准AdaBoost算法只适用于二分类任务):
(
X
1
,
Y
1
)
,
(
X
2
,
Y
2
)
,
.
.
.
(
X
n
,
Y
n
)
(X1,Y1), (X2,Y2),...(Xn, Yn)
(X1,Y1),(X2,Y2),...(Xn,Yn)
其中 xi是一个含有d个元素的列向量, 即 xi∈X⊆Rd ; yi是标量, y∈(+1,−1)
Adaboost算法具体步骤如下:
1.初始化样本的权重
2.对m=1,2,…
M
M
M,重复以下操作得到
M
M
M个基学习器
(1).按照样本权重分布 Dm 训练数据得到第 m 个基学习器 Gm(x)
(2).计算 Gm(x) 在加权训练数据集上的分类误差率
(3) 计算 Gm(x) 的系数(即最终集成使用的的基学习器的权重)
(4) 更新训练样本的权重
3.构建最终的分类器线性组合
AdaBoost的python代码实现
import numpy as np
def adaBoostTrainDS(dataArr, labelArr, numIt=40):
"""
Args:
dataArr 特征标签集合
labelArr 分类标签集合
numIt 实例数
Returns:
weakClassArr 弱分类器的集合
aggClassEst 预测的分类结果值
"""
weakclassArr = []
m = np.shape(dataArr)[0] # 样本的个数
# 初始化 D,设置每个样本的权重值,平均分为m份
W = np.mat(np.ones((m, 1)) / m)
aggclassEst = np.mat(np.zeros((m, 1)))
for i in range(numIt):
# 得到决策树的模型
bestStump, error, classEst = buildStump(dataArr, labelArr, W)
# alpha目的主要是计算每一个分类器实例的权重(组合就是分类结果)
# 计算每个分类器的alpha权重值
alpha = float(0.5 * np.log((1.0 - error) / max(error, 1e-16)))
bestStump['alpha'] = alpha
# store Stump Params in Array
weakclassArr.append(bestStump)
print("alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error))
# 分类正确:乘积为1,不会影响结果,-1主要是下面求e的-alpha次方
# 分类错误:乘积为 -1,结果会受影响,所以也乘以 -1
expon = np.multiply(-1 * alpha * np.mat(labelArr).T, classEst)
print('(-1取反)预测值expon=', expon.T)
# 计算e的expon次方,然后计算得到一个综合的概率的值
# 结果发现: 判断错误的样本,D中相对应的样本权重值会变大。
W = np.multiply(W, np.exp(expon))
W = W / W.sum()
# 预测的分类结果值,在上一轮结果的基础上,进行加和操作
print('当前的分类结果:', alpha * classEst.T)
aggclassEst += alpha * classEst
print("叠加后的分类结果aggClassEst: ", aggclassEst.T)
# sign 判断正为1, 0为0, 负为-1,通过最终加和的权重值,判断符号。
# 结果为:错误的样本标签集合,因为是 !=,那么结果就是0 正, 1 负
aggErrors = np.multiply(np.sign(aggclassEst) != np.mat(labelArr).T, np.ones((m, 1)))
errorRate = aggErrors.sum() / m
# 打印出错误率
if errorRate == 0.0:
break
return weakclassArr, aggclassEst
提升树
提升树模型是基学习器为决策树的加法模型,可以视为 AdaBoost 的特例。对于二分类问题只要取 AdaBoost 的基学习器为二分类树即可。不同问题提升树算法区别于其所用的损失函数,例如使用平方误差损失函数的回归问题、用指数损失函数的分类问题,以及用一般损失函数的一般决策问题[1]。
讨论平方误差损失函数的回归问题,要学的基学习器的树是关于输入空间
x
x
x的划分,即
x
x
x 划分成
J
J
J个互不相交的区域
R
1....
R
j
R1....Rj
R1....Rj ,且每个区域上确定一个常数 , 树可以表示为:
同样采用前向分步算法,第
m
m
m步为:
采用平方损失函数:
可以得:
其中残差
那么,第
m
m
m步的回归树 是对每个数据点的残差进行拟合所得到的,也就是对下面这组数据拟合而来的回归树模型
但是貌似使用平方损失函数会对异常数据点 (outliers) 不是太 robust,简单举个例子说就是损失函数对异常大的值会过分关心。这就引出了梯度提升方法。
*梯度提升树
梯度提升总的来说是非常强大的机器学习算法,可以用来做 regression, classification, ranking. 从名字上看梯度提升方法是 Gradient Descent 和 Boosting 的结合. 为了应对更一般的损失函数,它与树提升方法的差异是:使用损失函数的的负梯度作为上述回归问题中残差的近似。具体的过程这里没有详细介绍
RF随机森林
随机森林是Bagging的一个扩展变体,RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择性选择。具体来说,传统决策树在选择划分属性的时是在当前节点的属性集合中选择一个最优属性,而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含
k
k
k个属性的子集,然后再从这个子集中选取一个最优属性用于划分,这里的参数
k
k
k控制了随机性的引入程度:若令
k
=
d
k=d
k=d,则基决策树的构建与传统决策树相同,若令
k
=
1
k=1
k=1,则是随机选择一个属性用于划分。一般情况下,选择的是
k
=
l
o
g
2
d
k=log2d
k=log2d.
随机森林简单易于实现,计算开销小,令人惊奇的是,它在很多现实任务中展现出强大的性能,被誉为"代表集成学习技术水平的方法"。可以看出,随机森林对Bagging中基学习器的"多样性"仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中的基学习器的多样性不仅来自于样本扰动,还可能来自于属性扰动,这就使得最终集成的泛化性能可能通过个体学习器之间差异度的增加而进一步提升。
随机森林的收敛性与Bagging相似。如下图
随机森林的起始性能往往相对较差,特别是在集成中只包含一个学习器时,这很容易理解,因为通过属性扰动,随机森林中个体学习器的性能往往有降低,然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差,值得一提的是,随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中,Bagging使用的是"确定型"决策树,在划分属性的时候要对结点所有的属性进行考察,而随机森林使用的“随机性”决策树则只需考察一个属性子集。
以上内容仅仅作为学习笔记,如果有错误,希望批评指正
参考
[1]李航. “统计学习方法.”
[2]周志华 .”机器学习“西瓜书
[3]其他人的学习笔记