1. boosting
简介:
Boosting算法的工作机制是首先从训练集用初始权重(一般取1/m)训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,提高哪些被前一轮弱分类器错误分类样本的权值,降低那些被正确分类的样本权值。使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T或者学习误差率低于设定的阈值,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
代表算法:
AdaBoost算法和提升树(boosting tree)算法
提升树的广泛应用是梯度提升树(Gradient Boosting Tree):梯度提升树的思想是对损失函数作梯度提升,对于回归问题,当损失函数为平方损失函数时,模型去拟合残差;若损失函数不是平方损失函数,则利用损失函数的负梯度作为残差的近似值。
2. bagging
简介:
bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的随机采样,我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。
对于这里的随机采样有必要做进一步的介绍,这里一般采用的是自助采样法(Bootstrap sampling),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回(有放回),也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。通过样本扰动得到不同的弱学习器。
代表算法:
随机森林(RF):随机森林是bagging的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。随机森林通过样本扰动和属性扰动得到不同的弱学习器,这使得最终集成的泛化性能通过个体学习器之间的差异度的增加而提升。
样本扰动:如上所述,就是对样本有放回的采样。为得到泛化性能强的集成,集成学习中的个体学习器尽量相互独立。“独立”就是让各个基学习器之间有较大的差异性。做法就是对样本进行采样,产生多个子集,再从每个训练子集中训练出一个基学习器。对于每一个所学习器,所学习的样本都是不一样的,这样由于训练数据的不同,所产生的基学习器可望有比较大的差异。
为什么要有放回:值得注意的是,各个训练子集之间是相互堆叠的,也就是有交集的。有交集的原因是我们在采样的时候是有放回的。假设不放回,各个训练子集之间就没有交集,每个基学习器只能学习到当前的样本特征,我们的目标不仅希望各个基学习器之间有比较大的差异,而且希望个体学习器之间不能太差。如果采样出每个子集都完全不同,则基学习器值只学到了一小部分训练数据,甚至不足以有效学习。因此,采用有放回的采样方法。
属性扰动:以传统的决策树为例,一般是采用信息增益或者信息增益率的方式从当前节点的属性集合(假设有d个属性)中选出最优的属性;而在RF中,先从该节点的属性集合中随机选择k(k<=d)个属性集合,再从这k个属性集合中挑选最优的属性用于划分,k在这里是一个参数,推荐值:
,通过属性扰动使随机森林的泛化性能随个体学习器的差异性的增加而提升。
3. 组合策略:
a. 平均法
对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干个弱学习器的输出进行平均得到最终的预测输出。
平均法又分为简单平均法和加权平均法,简单平均法就是加权平均令wi = 1/T的特例。加权平均的权重一般是从训练数据中学习到的。
b. 投票法
最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数,也就是T个弱学习器的对样本x的预测结果中,数量最多的类别cici为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。
更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
c. 学习法(stacking)
对弱学习器的结果做平均或者投票,相对比较简单,但是可能学习误差较大,于是就有了学习法这种方法,对于学习法,代表方法是stacking,当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。
在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。
对于不是stacking的方法:
训练集输入->若干弱学习器-->若干弱学习器输出-->平均法投票法得到预测输出。
对于stacking方法:
训练集输入->若干弱学习器1-->若干学习器1输出(所有的输出作为学习器2的输入特征)-->次级学习器2-->学习器2输出即为预测输出。
stacking实现:
from sklearn import datasets
iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
import numpy as np
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr)
print('3-fold cross validation:\n')
for clf, label in zip([clf1, clf2, clf3, sclf],
['KNN',
'Random Forest',
'Naive Bayes',
'StackingClassifier']):
scores = model_selection.cross_val_score(clf, X, y,
cv=3, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f) [%s]"
% (scores.mean(), scores.std(), label))
Reference:
刘建平大佬的博客
《机器学习》周志华
《统计学习方法》李航
https://blog.csdn.net/willduan1/article/details/73618677