Udacity机器学习入门笔记4-集成方法

1 概述

在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。
集合方法可分为两类:

  • 序列集成方法,其中参与训练的基础学习器按照顺序生成(例如 AdaBoost)。序列方法的原理是利用基础学习器之间的依赖关系。通过对之前训练中错误标记的样本赋值较高的权重,可以提高整体的预测效果。
  • 并行集成方法,其中参与训练的基础学习器并行生成(例如 Random Forest)。并行方法的原理是利用基础学习器之间的独立性,通过平均可以显著降低错误。

总结一下,集成学习法的特点:

  1. 将多个分类方法聚集在一起,以提高分类的准确率。(这些算法可以是不同的算法,也可以是相同的算法。)
  2. 集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类.
  3. 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法。
  4. 通常一个集成分类器的分类性能会好於单个分类器
  5. 如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。

自然地,就产生两个问题:

1)怎么训练每个算法?

2)怎么融合每个算法?

这篇博客介绍一下集成学习的几个方法:Bagging,Boosting以及Stacking。

2 集成学习方法

2.1 Bagging(bootstrap aggregating,装袋)

Bagging即套袋法,先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:
  A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
  B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
  C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

在这里插入图片描述
由此,总结一下bagging方法:
  ① Bagging通过降低基分类器的方差,改善了泛化误差
  ② 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起
  ③ 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例

常用的集成算法类是随机森林。
  在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即 bootstrap 样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。
因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。

2.2 Boosting

其主要思想是将弱分类器组装成一个强分类器。在PAC(probably approximately correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。
关于Boosting的两个核心问题:
  1)在每一轮如何改变训练数据的权值或概率分布?
  通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
  2)通过什么方式来组合弱分类器?
  通过加法模型将弱分类器进行线性组合,比如:
  AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
  GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。
在这里插入图片描述

3 数学模型

GBRT考虑的添加模型如下
F(x)=m=1Mγmhm(x) F(x)=\sum_{m=1}^{M} \gamma_{m} h_{m}(x)

hm(x)h_{m}(x)是弱学习的基础函数,Gradient Tree Boosting使用固定大小决策树作为弱学习,决策树有处理混合型和复杂功能的建模能力。
GBRT以贪婪风格实现加法模型:
Fm(x)=Fm1(x)+γmhm(x) F_{m}(x)=F_{m-1}(x)+\gamma_{m} h_{m}(x)
其中新添加的hm(x)h_{m}(x)努力把损失降到最低 :
hm=argminhi=1nL(yi,Fm1(xi)+h(xi)) h_{m}=\arg \min _{h} \sum_{i=1}^{n} L\left(y_{i}, F_{m-1}\left(x_{i}\right)+h\left(x_{i}\right)\right)
GBRT试图通过最速下降数值解决这个最小化问题:最速下降方向是损失函数的负梯度方向
Fm(x)=Fm1(x)γmi=1nFL(yi,Fm1(xi)) F_{m}(x)=F_{m-1}(x)-\gamma_{m} \sum_{i=1}^{n} \nabla_{F} L\left(y_{i}, F_{m-1}\left(x_{i}\right)\right)
步长γm\gamma_{m}使用线搜索选择:
γm=argminγi=1nL(yi,Fm1(xi)γL(yi,Fm1(xi))Fm1(xi)) \gamma_{m}=\arg \min _{\gamma} \sum_{i=1}^{n} L\left(y_{i}, F_{m-1}\left(x_{i}\right)-\gamma \frac{\partial L\left(y_{i}, F_{m-1}\left(x_{i}\right)\right)}{\partial F_{m-1}\left(x_{i}\right)}\right)
对于回归和分类的算法只是使用的损失函数不同。

4 sklearn 应用

>>> from sklearn.model_selection import cross_val_score
>>> from sklearn.datasets import make_blobs
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.tree import DecisionTreeClassifier

>>> X, y = make_blobs(n_samples=10000, n_features=10, centers=100,
...     random_state=0)

>>> clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,
...     random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean()                               
0.98...

>>> clf = RandomForestClassifier(n_estimators=10, max_depth=None,
...     min_samples_split=2, random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean()                               
0.999...

>>> clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,
...     min_samples_split=2, random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean() > 0.999
True

在这里插入图片描述

5 mini-project

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier(n_estimators=100)
t0 = time()
#print len(features_train[0])
clf.fit(features_train,labels_train)
print "training time:", round(time()-t0,3),"s"
t0 = time()
pred =clf.predict(features_test)
print "predict time:", round(time()-t0,3),"s"
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(labels_test,pred)
print accuracy

在这里插入图片描述在这里插入图片描述在这里插入图片描述

6 参考文献

机器学习–集成学习(Ensemble Learning) https://www.cnblogs.com/zongfa/p/9304353.html
sklearn ensemble methods https://scikit-learn.org/stable/modules/ensemble.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章