机器学习笔记四------集成学习

集成学习(ensenmblelearning)构建并结合多个学习器来学习,常可获得比单一学习器显著优越的泛化性能。PAC(概率近似正确)定义:弱学习器为泛化性能略高于随机猜测的学习器,强学习器指的是识别准确率高并且能在多项式时间内完成的学习器。集成学习可将多个弱学习器结合以达到强学习器的效果。对于集成学习中,个体学习器要有一定的准确性(至少不差于弱学习器)并且要有多样性,即学习期间有差异,然而准确性和多样性二者冲突。

目前集成学习分为两类:(1)个体学习器间存在强烈依赖关系,必须串行生成,如Boosting (2)个体学习器间不存在强依赖关系,可并行化,如Bagging和随机森林

Boosting

先从初始训练样本训练出一个基学习器,再根据基学习器的表现对样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,再基于调整后的样本分布训练下一个基学习器,重复进行,直至达到基学习器的指定数目T,最终将T个学习器加权结合。最著名的代表是AdaBoost(Adaptive Boosting

在AdaBoost算法中,初始时,m个样本均匀分布,权值均为1/m,第一个基分类器h1通过直接将基学习算法用于初始数据分布而得,然后计算此分类器的加权错误率,更新样本权值,使前一轮被分类错误的样本权重提高,并确定分类器权重,错误率越低,分类器权重越高,根据新的样本分布进行第二次训练,迭代进行,直至达到T个学习器或者学习器的性能不能高于弱分类器则停止迭代,所有分类器加权表决。标准Adaboost只适用与于二分类任务。

除了通过重赋权重对数据分布进行改变之外,Boosting算法也可以采用重采样发,二者无明显优劣差别。但对于赋权重法若因不满足性能高于弱学习器而早早迭代停止,可能会导致学习器数目太少,性能不佳,而重采样法可通过重新采样进行重启动使其持续到T轮。

Boosting主要关注降低偏差(预测输出与实际标记的差异),是一族将弱学习器提升为强学习器的算法。

Bagging(Bootstrap aggregating)

串行式集成学习的著名代表,采用自助采样法(每次随机抽选并可放回供下次抽选)从m个样本中采样出T个m个样本,基于每个采样集训练一个基学习器,再用所有学习器进行简单投票(回归中为简单平均)。自助采样法使Bagging可以每个基学习器有未被选中的36.8%个样本做验证集对泛化性能进行包外估计。Bagging主要关注降低方差,基学习器的多样性来源样本扰动,在易受样本扰动的学习器上效果更为明显,如不剪枝决策树,神经网络。

随机森林(RF)在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树训练过程中引入随机属性选择,即在选择属性时先在属性集合d中随机选k个属性的子集,再在其中选最优用于划分,k控制了随机性的引入程度,一般情况下(k=log2d)。故随机森林学习器的多样性来自于样本扰动和属性扰动,使得个体学习器差异更大而集成泛化性能提升。随机森林收敛性能类似与Bagging,起始性能往往相对较差,因为引入属性扰动降低了基学习器性能,但随着学习器数目增加,随机森林通常会收敛到更低的泛化误差。由于选属性时只考虑属性子集,随机森林的训练效率往往由于Bagging。

多学习器结合的优势:

(1)  对于具有同等性能的多个假设,单学习器可能会误选

(2)  多学习器结合可减少陷入局部极小点的风险

(3)  多学习器结合可使假设空间变大,有可能学得更好的近似

多学习器结合的方法:

(1)  平均法:直接平均以及加权平均法。加权平均法的权重确定是集成学习的基本出发点,但若规模较大,易过拟合,故未必一定由于简单平均(个体学习器相差较大时宜采用加权平均,性能相近采用直接平均

(2)  投票法:

绝对多数投票法:超过半数则预测,否则拒绝预测,适用于可靠性要求较高

相对多数投票法:选得票最多的,若同样多,随机选取一个,若不允许拒绝,则使用点对多数投票法

加权投票法(选最多,但是加权比较)

(3)学习法:通过另一个学习器进行结合学习

Stacking:是指训练一个学习器用于组合其他各个学习器。即首先我们先训练多个不同的模型,然后再以之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。


代码实现:

# 导入pandas,并且重命名为pd。
import pandas as pd
# 通过互联网读取泰坦尼克乘客档案,并存储在变量titanic中。
titanic =pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
# 人工选取pclass、age以及sex作为判别乘客是否能够生还的特征。
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 对于缺失的年龄信息,我们使用全体乘客的平均年龄代替,这样可以在保证顺利训练模型的同时,尽可能不影响预测任务。
X['age'].fillna(X['age'].mean(), inplace=True)
# 对原始数据进行分割,25%的乘客数据用于测试。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25,random_state = 33)
# 对类别型特征进行转化,成为特征向量。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))
# 使用随机森林分类器进行集成模型的训练以及预测分析。
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc_y_pred = rfc.predict(X_test)
使用梯度提升决策树进行集成模型的训练以及预测分析。
from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier()
gbc.fit(X_train, y_train)
gbc_y_pred = gbc.predict(X_test)
# 从sklearn.metrics导入classification_report。
from sklearn.metrics import classification_report
# 输出随机森林分类器在测试集上的分类准确性,以及更加详细的精确率、召回率、F1指标。
print( 'The accuracy of random forest classifier is', rfc.score(X_test,y_test))
print( classification_report(rfc_y_pred, y_test))
# 输出梯度提升决策树在测试集上的分类准确性,以及更加详细的精确率、召回率、F1指标。
print( 'The accuracy of gradient tree boosting is', gbc.score(X_test,y_test))
print (classification_report(gbc_y_pred, y_test))

--来自《Python机器学习及实践 —— 从零开始通往Kaggle竞赛之路》

猜你喜欢

转载自blog.csdn.net/qy724728631/article/details/78659013