所谓集成学习,就是训练出完成统一任务的多个不同的子模型,并综合这些子模型的预测结果做出最终的预测。集成学习中的每一个子模型都都称为一个弱模型,对多个弱模型的综合就称为强模型。弱模型的选择是灵活多样的,可以源自不同的机器学习算法,也可以是同一算法,当源自同一算法时,需要采用不同的训练数据或者不同的特征选择。综合弱模型的预测结果的方式也可以灵活多样,比如可以对预测结果取平均值,也可以取众数,还可以将一个弱模型的输出作为另一个弱模型的输入。
集成学习算法大致可以分为两类:袋装法(bagging)和提升法(boosting)。
袋装法又称自助法(bootstrap法),其使用 bootstrap 抽样,即有放回抽样,每次训练子模型使用的训练样本均为从原训练样本中有放回抽样得来,在这些子训练集中各自独立地建立弱模型,并用这些弱模型预测。如果弱模型为决策树,那么该集成算法就是随机森林。
因为是有放回的抽样,能有效降低方差
对于n个独立同分布的随机变量Xi,假设他们的方差为σ^2,则n个随机变量均值的方差为
如果将每个弱模型的预测结果作为随机变量,那么多个弱模型的预测结果平均值,其方差只有单个弱模型的 1/n 。
为何方差越小越好?
方差越大,波动性越大,预测结果波动性大。试想一下,一个模型今天预测是A,明天预测是B,后天就变C了,你觉得这个模型靠谱吗?
而小的方差,代表预测结果更加稳定,虽然稳定值不一定正确,但只要每一个弱模型预测正确的概率比较大,那么结果的可信度就能大大提高。试想一下,某个集成模型,今天预测是A,明天也是A,后天也A,一个星期里6天预测是A,只有一天预测是B,由于波动性小,总体来看,这个集成模型还是比较靠谱的,因为预测结果稳定于结果A,虽然真实结果未必就是A,但总比上一个模型更靠谱。这里的集成模型,是由100个弱模型构成,最后的结果是100个弱模型投票,可以认为是100个人投了一个星期的票,每个人在一周内的波动性都大,但每天投票的综合结果却是稳定的。
当然,上面的解释不严谨,只是方便理解,因为每个弱模型未必相互独立,预测结果也未必同分布。比如在随机森林中,由于生成每一棵树的数据子集取自同一训练集,因此这些训练集存在一定的关联性,训练出来的每棵决策树也是比较相似,这样各棵决策树无法做到独立同分布。
随机森林的思想依据是:虽然森林中的每棵树都有一定的预测错误概率,但它们同时出错的概率是很低的。
通过重复采样,随机森林预测的均方误差,以及发生过拟合的概率都小于单棵决策树。
为了增加随机森林中各棵树独立的可能性,随机森林在训练每棵决策树的时候需要一个额外的步骤:在每次划分数据时,随机的选取一部分特征进行遍历,而不是遍历所有的特征,因为考虑的特征不一样,这样各个决策树就有不一样结构,这样就能使得每棵树的预测结果更加接近于独立同分布(独立好理解了,但同分布如何理解?因为每棵树都在拟合相同的目标值,相当于在拟合同一个分布,因此可以认为预测结果是同分布)。当然,上述措施只能在某种程度上是预测结果接近独立同分布,只要每个训练子集取自同一个样本集,就很难真正做到独立同分布。
极限随机树,又称极限森林、极端随机树。
随机森林中,每棵树都是随机选择一部分样本(有放回),生成决策树时,每次划分都是随机选择一部分特征(无放回),然后遍历这些特征的所有取值,以确定划分所使用的特征和阈值。
极限森林与随机森林主要有两个区别,一是使用所有的样本,二是极限森林在每次划分时,随机选择阈值。何谓“随机选择阈值”,我们这里来解释一下:
假如原始的数据有10个特征,在每次划分样本时,随机抽5个特征作为特征子集,为特征子集中的每一个特征随机选择一个值作为候选阈值,那么会有5个候选阈值,分别计算这5个候选阈值对应的基尼系数或者交叉熵(如果是回归问题则计算均方差),能得到最小基尼系数或交叉熵的候选阈值,即为最终的阈值,其对应的特征,就是本次划分时使用的特征。
随机森林是在特征子集里面遍历选择特征,极限森林为特征子集中的每个特征随机生成一个阈值,并从这些随机生成的阈值中选取最佳阈值作为分割规则。
API
极限分类森林
sklearn.ensemble.ExtraTreesClassifier(n_estimators=100, criterion='gini', max_depth=None, max_features='auto', rand_state=None)
n_estimators 极限森林中决策树的数量,默认100
criterion 划分样本时采用的标准,可以选择 ‘gini’,也可以 ‘entropy’,默认 ‘gini’
max_depth 每棵树的最大深度
max_features 特征子集中的特征数目,默认是auto,即对样本总特征数取平方根(max_features=sqrt(n_features))
random_state 随机种子
其他参数基本和随机森林一致。
除了极限分类森林外,还有极限回归森林,其原理和API与分类森林类似。
提升法是在同一个训练集上依次训练出一系列弱模型,每一个弱模型在训练的时候,都在拟合上一个弱模型的误差,因此,这些弱模型具有很强的依赖关系,集成模型的每次迭代,都是向其加入一个弱模型,提升算法的核心思想是让每一个弱模型都能弥补前一个弱型的不足,从而使得集成模型(强模型)得到的最终结果更加准确。
梯度提升树(Gradient Boosting Decision Tree,简称gbdt)是由很多回归树组成,其基本思想是不断生成新的决策树来拟合前一棵决策树的误差,以期所有决策树预测的综合达到良好的效果。
具体来说,给定一个回归问题的训练数据 S={(x(1), y(1)),(x(1), y(1)),……,(x(m), y(m))},按照惯例,用
分别表示特征矩阵和标签向量。
算法第一棵决策树 T0 来表示最小化均方误差
用 r0=y-T0(X) 表示决策树 T0 的预测误差。可以认为,r0 是 T0 的不足之处。为了弥补不足,再训练一棵决策树 T1 来拟合误差 r0,因此,T1的任务是最小化均方误差
此时,用 r1 = r0 - T1(X) 表示 T1 的预测误差。由此,梯度提升回归树又可以再训练一棵决策树 T2 来拟合误差 r1 。这一过程可以不断地进行下去,直到决策树的误差接近0。
将上面格式相加并左右消元之后,可以得到:
因此,可以用一系列回归决策树输出结果的和来拟合标签,这就是梯度提升树的回归算法原理。
梯度提升树中,弱模型是决策树,如果不对决策树的深度进行限制,那么每棵决策树都会对训练集进行准确无误地拟合,弱模型不需要那么高的精度,因此可以使用深度来约束弱模型的精度。
由于该算法类似于函数空间中的梯度下降算法,每一次对前一棵树的误差拟合,都相当于在函数空间中沿梯度反方向搜索,并以此来提升模型的效果,因此成为梯度提升树。
Shrinkage 的思想认为,每走一小步要比每次迈一大步更容易接近极值点,像函数空间中的梯度下降算法一样,这里可以加入学习率的概率。
假设 F(x)为强模型,如果没有学习率,则
每增加一棵树,都是对强模型的一次迭代
Shrinkage 不直接用残差修复误差,而是只修复一点点,把大步切成小步,本质上是给每棵树加上一个权值,即它并不是完全信任每一棵残差树。
图片中 α 是学习率。
从最后的结果可以看到,当加上学习率之后,最后的强模型,是若干个弱模型预测值之和乘以学习率。
因此,迭代强模型时
sklearn.ensemble.GradientBoostingRegressor(learning_rate=0.1, n_estimators=100, max_depth=3, random_state=None)
learning_rate 学习率,默认0.1
n_estimators 树的棵数
max_depth 每棵树的最大深度
random_state 随机数种子
Adaboost是一种应用于二分类问题的算法,它用弱分类器的线性组合来构造强分类器,弱分类器的性能不太好用,仅比随机瞎猜强,依靠它们可以构造一个非常准确的强分类器。
在每次训练弱模型时,都重点关注上一个弱模型中预测错误的样本。其大致过程是:对于第k个弱模型预测错误的样本,为其增大权重,预测正确的样本缩小权重,同时根据第k个弱模型的预测错误率,为弱模型分配权重。训练集的每一个样本,在每次训练弱模型时,都会改变权重。弱模型一般是用决策树。
具体公式理论的推导与证明,详见《机器学习与应用》雷明 清华大学出版社,P284-295。
sklearn.ensemble.AdaBoostClassifier(n_estimators=100)
n_estimators 弱模型的数量,这里的弱模型指的是深度为1的决策树。