您的位置:首页 > 其它

西瓜书 第八章习题 集成学习总结(Adaboost、GradientBoost、Bagging、RandomForest)

2018-01-23 15:02 477 查看
数据及代码在git上:https://github.com/qdbszsj/Ensemble-learning

这里用sklearn实现的代码,4种常用的集成学习的方法,手写有点麻烦,这里重点不是代码,是学习总结。

集成学习(ensemble-learning)通过将多个学习器进行结合,常常可以获得比单一学习器更显著的泛化性能,我们的目标是基于一个大数据集产生若干“好而不同”的学习器,然后用这些学习器去进行预测,少数服从多数,或者根据误差或者主管判断进行加权什么的。

目前的集成学习方法有两大类:

一类是boosting,串行地产生的若干基学习器,后一个基学习器依据前一个基学习器的表现,进行一些参数的调整,从而依次产生若干新的基学习器,这里参数的调整方案不同,因此又分为Adaboost、GradientBoost等等boost,Adaboost相当于是不修改原数据内容,只是进行加权(重赋权法,re-weighting)或者是重采样(re-sampling),从而让错误数据受到更多重视,而gradientBoost是直接根据原数据和预测出的数据的差值,修改当前数据再进行下一次迭代,大概就是这样,具体迭代公式此处篇幅不易展开。

另一类是Bagging、随机森林这些,可以并行产生的。Bagging是用自助采样法,m个样本,独立采m次,根据极限法则,m趋于无穷时,(1-1/m)^m=1/e,也就是说有1/e的样本没有被采到,我们就用剩下的1-1/e=63.2%的样本来生成模型,这样子有很多独立的样本,可以并行计算出很多独立的预测模型,最后再把这些模型整合在一起。这里用自助采样有一个好处,是可以用剩下的36.8%的模型进行外包估计,决策树里可以用来辅助剪枝,神经网络里可以辅助早停,防止过拟合。另外,bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效果明显。RF就是在Bagging决策树基础上加了一点随机因素,让每次选属性子集的时候随机舍弃一些属性,这样子基学习器基本上还是好的学习器,但是不同基学习器的差异性会大一些,正好符合我们“好而不同”的要求。而且在训练RF的时候,因为可以舍弃一些属性,训练速度还加快了。这里有个参数k,假如当前有d个可选属性,我们通常保留k=log2(d)个,就是16个里留4个,8个里留3个,4个里留两个[Breiman,2001a]。

不同的基训练模型,我们通常用不同的数据处理方法以增强模型的多样性,对于决策树、神经网络这样“不稳定基学习器”,数据样本稍加扰动就可以产生不同的模型,因此我们才能用Bagging、RF这样的方法,但是对于线性学习器、SVM、朴素贝叶斯、k近邻这样的“稳定学基习器”,往往要用扰动其属性才有效果,有个常用的随机子空间算法,类似于“降维打击”,相当于提取出属性子集来训练,直观来说就是观察数据的视角不同,因此训练出的模型也会千奇百怪,但是总体来讲还是好的。当然,这种降维打击只能用在维数比较高的数据,假如本身就一维了。。。降完就成一个点了。。。。

import numpy as np
import pandas as pd
import sklearn.ensemble
dataset=pd.read_csv('/home/parker/watermelonData/watermelon3_0a.csv', delimiter=",")
del dataset['num']
X=dataset.values[:,:-1]
y=dataset.values[:,-1]
m,n=np.shape(X)
for i in range(m):
X[i, n - 1] = round(X[i, n - 1], 3)
X[i, n - 2] = round(X[i, n - 2], 3)
print(dataset)

def showConfusionMatrix(trueY,myY):
confusionMatrix = np.zeros((2, 2))
for i in range(len(trueY)):
if myY[i] == trueY[i]:
if trueY[i] == 0:
confusionMatrix[0, 0] += 1
else:
confusionMatrix[1, 1] += 1
else:
if trueY[i] == 0:
confusionMatrix[0, 1] += 1
else:
confusionMatrix[1, 0] += 1
print(confusionMatrix)

myAdaboost=sklearn.ensemble.AdaBoostClassifier(n_estimators=20,learning_rate=0.1,algorithm='SAMME.R')
myAdaboost.fit(X,y)
predictY=myAdaboost.predict(X)
print(y)
print(predictY)
showConfusionMatrix(y,predictY)

myBagging=sklearn.ensemble.BaggingClassifier(n_estimators=50)
myBagging.fit(X,y)
predictY=myBagging.predict(X)
print(y)
print(predictY)
showConfusionMatrix(y,predictY)

myGradient=sklearn.ensemble.GradientBoostingClassifier(n_estimators=1,learning_rate=0.1,max_depth=3)
myGradient.fit(X,y)
predictY=myGradient.predict(X)
print(y)
print(predictY)
showConfusionMatrix(y,predictY)

myForest=sklearn.ensemble.RandomForestClassifier(n_estimators=10)
myForest.fit(X,y)
predictY=myForest.predict(X)
print(y)
print(predictY)
showConfusionMatrix(y,predictY)

参考资料:

周志华《机器学习》

sklearn文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: