天天看点

Python 数据分析实例——集成方法

作者:昌华量化
Python 数据分析实例——集成方法

1.集成方法的概念

通过聚合多个分类器的预测来提高分类的准确率,这种技术称为集成方法(Ensemble Method)。集成方法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行权重控制以作出分类。

集成技术在数据挖掘的3个方向:

· 在样本上做工作,基分类器为同一个分类算法,主要的技术有Bagging和Boosting。

· 在分类算法上做工作,即用于训练基分类器的样本相同,基分类器的算法不同。

· 在样本属性集上做工作,即在不同的属性空间上构建基分类器,比较出名的是randomforestTree算法,这个在weka中也有实现。

集成方法大致包括3种框架:Bagging、Boosting和Stacking。对于Bagging来说,添加随机变量的学习器反而能够提高整体的效果。这3种方法中,Boosting是表现最好的模型,它与有着广泛研究基础的加性模型(Addictive Models)的统计技术有着相近的关系。

2.集成学习的几种方法

· 在验证数据集上找到表现最好的模型作为最终的预测模型。

· 对多个模型的预测结果进行投票或者取平均值。

· 对多个模型的预测结果做加权平均。

以上几种思路对应了集成学习中的几种主要的学习框架。

(1)多个模型投票或者取平均值

对于数据集训练多个模型来说,分类问题可以采用投票的方法,选择票数最多的类别作为最终的类别;而回归问题,可以采用取均值的方法,取得的均值作为最终的结果。在这样的思路中,最著名的是Bagging方法,Bagging即Boostrap Aggregating,其中Boostrap是一种有放回的抽样方法,其抽样策略是简单的随机抽样。在Bagging方法中,让学习算法训练多次,每次的训练集由初始的训练集中随机取出的训练样本组成,初始的训练样本在某次的训练集中可能出现多次或者根本不出现。最终训练出个预测函数,最终的预测函数对于分类和回归问题可采用如下两种方法:

· 对于分类问题采用投票的方法,得票最多的类别为最终的类别。

· 对于回归问题采用简单的平均方法。

随机森林算法就是基于Bagging思想的学习算法。

(2)对多个模型的预测结果进行加权平均

在上述的Bagging方法中,其特点在于随机化抽样,通过反复地抽样训练新的模型,最终在这些模型的基础上取平均。而对多个模型的预测结果进行加权平均,则是将多个弱学习模型提升为强学习模型,这就是Boosting的核心思想。在Boosting算法中,初始化时对每个训练样本赋予相等的权重,如frac{1}{n},然后用该学习算法对训练集训练G轮,每次训练后,对训练失败的训练样本赋予更大的权重,也就是让学习算法在后续的学习中对几种比较难学的训练样本进行学习,从而得到一个预测函数序列left {h1,cdots,h,G right},其中每个hi都有一个权重,预测效果好的预测函数的权重较大。最终的预测函数为H。对于分类和回归问题可采用如下两种方法。

· 分类问题:有权重的投票方式。

· 回归问题:加权平均。

3.组合分类器的性能优于单个分类器的条件

组合分类器的性能优于单个分类器必须满足两个条件:

· 基分类器之间是相互独立的。

· 基分类器应当优于随机猜测分类器。

实践时很难保证基分类器之间完全独立,但是在基分类器轻微相关的情况下,组合方法可以提高分类的准确率。

Adaboost算法

如果存在一个多项式的学习算法能够学习并且正确率很高,就称为强可学习;相反,弱可学习就是学习的正确率仅比随机猜测稍好。

1.Adaboost迭代算法

整个Adaboost迭代算法就3步:

(1)初始化训练数据的权值分布。如果有N个样本,那么每一个训练样本最开始时都被赋予相同的权重:1/N。

(2)训练弱分类器。在具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集时,它的权重就会被降低;相反,如果某个样本点没有被准确地分类,它的权重就会得到提高。然后,权重更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

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

2.Adaboost算法的流程

给定一个训练数据集T={(x1,y1), (x2,y2),…,(xN,yN)},其中实例x∈χ,而实例空间,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。

Adaboost算法的流程说明如下:

(1)步骤1:初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权重:1/N。

Python 数据分析实例——集成方法

(2)步骤2:进行多轮迭代,用m = 1,2, ..., M表示迭代的第多少轮。

①使用具有权值分布Dm的训练数据集学习,得到基本分类器:

Python 数据分析实例——集成方法

②计算Gm(x)在训练数据集上的分类误差率:

Python 数据分析实例——集成方法

③计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的是得到基本分类器在最终分类器中所占的权重):

Python 数据分析实例——集成方法

由上述式子可知,em≤1/2时,am≥0,且am随着em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。

④更新训练数据集的权值分布(目的是得到样本的新的权值分布),用于下一轮迭代:

Python 数据分析实例——集成方法

使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。通过这样的方式,Adaboost方法能“聚焦于”那些较难分的样本上。

其中,Zm是规范化因子,使得Dm+1成为一个概率分布:

Python 数据分析实例——集成方法

(3)步骤3:组合各个弱分类器。

Python 数据分析实例——集成方法

从而得到最终分类器:

Python 数据分析实例——集成方法

①Adaboost的误差界:

通过上面的例子可知,Adaboost在学习的过程中不断减少训练误差e,直到各个弱分类器组合成最终分类器,Adaboost最终分类器的训练误差的上界为:

Python 数据分析实例——集成方法

②对于二分类而言,有如下结果:

Python 数据分析实例——集成方法

其中,

Python 数据分析实例——集成方法

这个结论表明,Adaboost的训练误差是以指数速率下降的。另外,Adaboost算法不需要事先知道下界γ,Adaboost具有自适应性,它能适应弱分类器各自的训练误差率。

【例1】在一个简单数据集上的Adaboost的实现。

Python 数据分析实例——集成方法
Python 数据分析实例——集成方法
Python 数据分析实例——集成方法

输出:

Python 数据分析实例——集成方法