版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十七章集成学习原理应用举例目录原理在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差、偏差或改进预测的效果。原理集成学习在各个规模的数据集上都有很好的策略。数据集大:划分成多个小数据集,学习多个模型进行组合。数据集小:利用Bootstrap方法进行抽样,得到多个数据集,分别训练多个模型再进行组合。集合方法可分为两类:序列集成方法,其中参与训练的基础学习器按照顺序生成(例如
AdaBoost)。序列方法的原理是利用基础学习器之间的依赖关系。通过对之前训练中错误标记的样本赋值较高的权重,可以提高整体的预测效果。并行集成方法,其中参与训练的基础学习器并行生成(例如随机森林)。并行方法的原理是利用基础学习器之间的独立性,通过平均可以显著降低错误。原理总结一下,集成学习法的特点:将多个分类方法聚集在一起,以提高分类的准确率(这些算法可以是不同的算法,也可以是相同的算法)。集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类。严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法。通常一个集成分类器的分类性能会好于单个分类器。如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。原理下面介绍集成学习的几个方法:Bagging,Boosting以及Stacking。1.Bagging(bootstrap
aggregating,装袋)Bagging即套袋法,先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:从原始样本集中抽取训练集。每轮从原始样本集中使用
bootstrap的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)原理(3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)原理由此,总结一下bagging方法:Bagging通过降低基分类器的方差,改善了泛化误差。其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器
的误差主要由基分类器的偏倚引起。由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例。常用的集成算法类是随机森林。在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即bootstrap样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。原理Boosting其主要思想是将弱分类器组装成一个强分类器。在PAC(probablyapproximately
correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。关于Boosting的两个核心问题:在每一轮如何改变训练数据的权值或概率分布?通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。通过什么方式来组合弱分类器?通过加法模型将弱分类器进行线性组合,比如:
AdaBoost(Adaptiveboosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学原理GBDT(GradientBoostDecisionTree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。原理StackingStacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。先在整个训练数据集上通过bootstrap抽样得到各个训练集合,得到一系列分类模型,然后将输出用于训练第二层分类器。具体的过程如下:(1)划分训练数据集为两个不相交的集合。在第一个集合上训练多个学习器。在第二个集合上测试这几个学习器。把第三步得到的预测结果作为输入,把正确的回应作为输出,训练一个高层学习器。这里需要注意的是(1)-(3)步的效果,我们不是用赢家通吃,而是使用非线性组合学习器的方法。原理4.Bagging,Boosting二者之间的区别
(1)Bagging和Boosting的区别:1)样本选择上:Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。2)样例权重:Bagging:使用均匀取样,每个样例的权重相等。Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。原理预测函数:Bagging:所有预测函数的权重相等。Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。并行计算:Bagging:各个预测函数可以并行生成Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。(2)决策树与这些算法框架进行结合所得到的新的算法:1)Bagging+决策树=随机森林2)AdaBoost+决策树=提升树3)Gradient
Boosting+决策树=GBDT应用举例【例17.1】泰坦尼克数据应用集成学习举例。1.获取数据,并输出数据分析的结果,可以发现Age这列有缺失值
import
pandas
as
pdtitanic
=
pd.read_csv("Titanic.csv")titanic.head()print(titanic.describe())#输出结果如图所示应用举例2.使用中值进行数据填充titanic["Age"]=titanic["Age"].fillna(titanic["Age"].median())
print(titanic.describe())#填充后输出结果如图17-2所示应用举例3.将Sex这一列的字符串转成整数,方便计算
print(titanic["Sex"].unique())#0:表示男,1表示女titanic.loc[titanic["Sex"]=="male","Sex"]=0titanic.loc[titanic["Sex"]=="female","Sex"]=14.将Embarked这一列的字符串转成整数print(titanic["Embarked"].unique())titanic["Embarked"]
=
titanic["Embarked"].fillna("S")titanic.loc[titanic["Embarked"]
==
"S",
"Embarked"]
=0titanic.loc[titanic["Embarked"]
==
"C",
"Embarked"]
=1应用举例#预测所用到的特征predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embark#初始化线性回归函数lg
=
LinearRegression()#初始化K折交叉验证函数#其中KFold是一个类,n_split=3表示,当执行KFold的split函数后,数据集被分成三份,两份训练集和一份验证集。kf
=
KFold(n_splits=3,shuffle=False)predictions
=
[]for
train,test
in
kf.split(titanic):应用举例import
numpy
as
nppredictions=np.concatenate(predictions,axis=0)#匹配输出结果,1表示生存,0表示死亡predictions[predictions>.5]=1predictions[predictions<=.5]=0accuracy
=
sum(predictions==
titanic["Survived"])
/
len(predictions)print(accuracy)输出结果:0.783389450056应用举例6.使用逻辑回归方法from
sklearn.linear_model
import
LogisticRegressfromsklearn.model_selection
import
cross_val_score#初始化逻辑回归函数lr=LogisticRegression(random_state=1,solver="liblinear")
#应用交叉验证并计算精确分数scores
=
cross_val_score(lr,titanic[predictors],titanic["Survived"]print(scores.mean())输出结果:0.7878787878787877应用举例7.使用随机森林方法fromsklearn.model_selection
import
KFold,cross_val_scorefrom
sklearn.ensemble
import
RandomForestClassifierpredictors
=
["Pclass",
"Sex",
"Age",
"SibSp",
"Parch",
"Fare",
"Embark#n_estimators:数的个数#min_samples_split:如果某节点的样本数少于min_samples_split,则不会续再尝试选择最优特征来进行划分#如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值#min_samples_leaf:这个值限制了叶子节点最少的样本数,如果某叶子节点应用举例rfc
=
RandomForestClassifier(random_state=1,n_estimators=10,min_samples_split=2,min_samples_leaf=1)#初始化K折交叉验证函数kf
=
KFold(n_splits=3,shuffle=False)scores
=
cross_val_score(rfc,titanic[predictors],titanic["Survived"
print(scores.mean())输出结果:0.7856341189674523应用举例8.调整参数之后的随机森林rfc
=
RandomForestClassifier(random_state=1,n_estimators=100,min_samples_split=4,min_samples_leaf=2)#初始化K折交叉验证函数kf
=
KFold(n_splits=3,shuffle=False)应用举例9.构造新的特征#生成一个家庭人数列titanic["FamilySize"]=titanic["SibSp"]+titanic["Parch"]#生成一个姓名长度seriestitanic["NameLength"]
=
titanic["Name"].apply(lambda
x:len(x))import
redef
get_title(name):#使用正则表达式搜索标题。标题总是由大写字母和小写字母组成,以应用举例#得到所有的名字的简称(title)titles
=
titanic["Name"].apply(get_title)
print(pd.value_counts(titles))#把每个title映射成整数,一些title是比较稀少的,所以被压缩成与其他标题相同的编码。title_mapping
=
{"Mr":
1,
"Miss":
2,
"Mrs":
3,
"Master":
4,
"Dr":
5,
"Rev"Major":
7,
"Col":
7,
"Mlle":
8,
"Mme":
8,
"Don":
9,
"Lady":
10,
"Countes"Jonkheer":
10,
"Sir":
9,
"Capt":
7,
"Ms":
2}应用举例10.特征重要性分析
import
numpy
as
np%matplotlibinlinefrom
sklearn.feature_selection
import
SelectKBest,f_classif#f_classif为方差分析,用来计算特征的f统计量的。import
matplotlib.pyplot
as
pltpredictors
=
["Pclass",
"Sex",
"Age",
"SibSp",
"Parch",
"Fare",
"Embark"FamilySize",
"Title",
"NameLength"]应用举例#画出分数,观察特征的分数plt.bar(range(len(predictors)),scores)plt.xticks(range(len(predictors)),predictors,rotation="vertical")plt.show()#特征分数如图所示应用举例根据上一幅图找出前四个最好的特征:predictors
=
["Pclass",
"Sex",
"Fare",
"Title"]rfc
=
RandomForestClassifier(random_state=1,n_estimators=50,min_samples_split=8,min_samples_leaf=4)scores
=
cross_val_score(rfc,titanic[predictors],titanic["Survived"应用举例11.每个算法都会有自己的优缺点,那么我们可不可以把两个模型集成起来呢?将boosting算法与逻辑回归算法分别进行训练,然后给予不同的权值使得结果更加精确from
sklearn.ensemble
import
GradientBoostingClassifierimport
numpy
as
npalgorithms
=
[[GradientBoostingClassifier(random_state=1,n_estimators=25,max_de应用举例for
train,test
in
kf.split(titanic):
train_target
=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年主管护师相关专业知识考试真题及答案
- 农村义务教育学校实施营养改善计划管理制度
- 2026二建《工程法规》真题及答案及解析
- 工业园区项目信息发布系统施工方案-专项施工方案
- 2026年7月份脾胃科护理理论知识试卷及答案
- 五星级酒店样板房装修详细施工方案
- 党办面试题目及答案
- 公安监狱面试题及答案
- 中外历史纲要(下) 板块4 第12单元 第34讲 第2课时 亚非拉民族民主运动的高涨
- 第一单元测试卷2026-2027学年统编版八年级下册语文
- 2025-2026学年北京市朝阳区高一(下)期末考试物化学卷(含答案)
- 江安县年产5000吨碳纳米管和3.6万吨CNT导电浆料项目报告表
- 2025年江苏省直机关公开遴选公务员笔试题及答案解析
- 静脉输液护理技术操作规范
- 护理沟通:有效沟通技巧培训
- 2026年建信金科测试题及答案
- 初中语文学考合一知识清单·兰州专版
- 热电站锅炉水循环计算书
- 基层党务干部培训班测试题及答案
- 2025年杨浦卫健委事业单位考试及答案
- 翡翠鉴定培训课件
评论
0/150
提交评论