💬内容概要
1 集成学习概述及主要研究领域
2 简单集成技术
2.1 投票法
2.2 平均法
2.3 加权平均
3 高级集成技术
3.1 Bagging
3.2 Boosting
3.3 Bagging vs Boosting
4 基于Bagging和Boosting的机器学习算法
4.1 sklearn中的Bagging算法
4.2 sklearn中的Boosting算法
集成学习概述及主要研究领域
1.1 集成学习概述💥
“众人拾柴火焰高”、“三个臭皮匠顶个诸葛亮”等词语都在表明着群体智慧的力量,所谓的“群体智慧”指的就是一群对某个主题具有平均知识的人集中在一起可以对某一些问题提供出更加可靠的答案。原因在于,汇总结果能够抵消噪音,得出的结论通常可以优于知识渊博的专家。同样的规则也适用于机器学习领域。
在机器学习中,群体智慧是通过集成学习实现的,所谓集成学习(ensemble learning),是指通过构建多个弱学习器,然后结合为一个强学习器来完成分类任务并获得比单个弱分类器更好的效果。严格来说,集成学习并不算是一种分类器,而是一种学习器结合的方法。
1.2 集成学习的三大关键领域💥
在过去十年中,人工智能相关产业蓬勃发展,计算机视觉、自然语言处理、语音识别等领域不断推陈出新、硕果累累,但热闹是深度学习的,机器学习好似什么也没有。2012年之后,传统机器学习占据的搜索、推荐、翻译、各类预测领域都被深度学习替代或入侵,在招聘岗位中,69%的岗位明确要求深度学习技能,传统机器学习算法在这一场轰轰烈烈的人工智能热潮当中似乎有些被冷落了。
在人工智能大热的背后,集成学习就如同裂缝中的一道阳光,凭借其先进的思想、优异的性能杀出了一条血路,成为当代机器学习领域中最受学术界和产业界青睐的领域。
从今天的眼光来看,集成学习是:
- 当代工业应用中,唯一能与深度学习算法分庭抗礼的算法
- 数据竞赛高分榜统治者,KDDcup、Kaggle、天池、DC冠军队御用算法
- 在搜索、推荐、广告等众多领域,事实上的工业标准和基准模型
- 任何机器学习/深度学习工作者都必须掌握其原理、熟读其思想的领域
在集成学习的发展历程中,集成的思想以及方法启发了众多深度学习和机器学习方面的工作,在学术界和工业界都取得了巨大的成功。今天,集成学习可以被分为三个主要研究领域:
- 弱分类器集成
弱分类器集成主要专注于对传统机器学习算法的集成,这个领域覆盖了大部分我们熟悉的集成算法和集成手段,如装袋法bagging,提升法boosting。这个领域试图设计强大的集成算法、来将多个弱学习器提升成为强学习器。
- 模型融合
模型融合在最初的时候被称为“分类器结合”,这个领域主要关注强评估器,试图设计出强大的规则来融合强分类器的结果、以获取更好的融合结果。这个领域的手段主要包括了投票法Voting、堆叠法Stacking、混合法Blending等,且被融合的模型需要是强分类器。模型融合技巧是机器学习/深度学习竞赛中最为可靠的提分手段之一,常言道:当你做了一切尝试都无效,试试模型融合。
- 混合专家模型(mixture of experts)
混合专家模型常常出现在深度学习(神经网络)的领域。在其他集成领域当中,不同的学习器是针对
同一任务、甚至在同一数据上进行训练,但在混合专家模型中,我们将一个复杂的任务拆解成几个相对简单且更小的子任务,然后针对不同的子任务训练个体学习器(专家),然后再结合这些个体学习器的结果得出最终的输出。
2 简单集成技术
在正式学习集成算法之前,我们先来了解一下简单的集成技术。
2.1 投票法💢
投票法主要用于分类问题中,主要流程是:使用N个弱分类器对每个样本进行预测,每个弱分类器得到的预测结果都被视为“投票”,对于同一个样本来说,会得到N个投票,N个投票中最多的那个类别即为这个样本最终的预测结果。也就是说,投票法的主要规则就是少数服从多数。
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import stats from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier as KNN from sklearn.tree import DecisionTreeClassifier as DTC from sklearn.linear_model import LogisticRegression as LR data = load_breast_cancer() X = data.data y = data.target Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=0) model1 = KNN() model2 = DTC() model3 = LR() model1.fit(Xtrain,Ytrain) model2.fit(Xtrain,Ytrain) model3.fit(Xtrain,Ytrain) pred1 = model1.predict(Xtest) pred2 = model2.predict(Xtest) pred3 = model3.predict(Xtest) final_pred = [] for i in range(Xtest.shape[0]): final_pred.append(stats.mode([pred1[i],pred2[i],pred3[i]])[0][0]) from sklearn.metrics import accuracy_score accuracy_score(Ytest,final_pred) print(model1.score(Xtest,Ytest)) print(model2.score(Xtest,Ytest)) print(model3.score(Xtest,Ytest))
2.2 平均法💢
平均法主要用于回归类问题,主要流程是:使用N个弱分类器对每个样本进行预测,每个样本的最终预测值就是N个弱分类器输出的预测结果的平均值。
from sklearn.datasets import load_diabetes from sklearn.neighbors import KNeighborsRegressor from sklearn.tree import DecisionTreeRegressor from sklearn.linear_model import LinearRegression data = load_diabetes() X = data.data y = data.target Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=0) reg1 = KNeighborsRegressor() reg2 = DecisionTreeRegressor(max_depth=2) reg3 = LinearRegression() reg1.fit(Xtrain,Ytrain) reg2.fit(Xtrain,Ytrain) reg3.fit(Xtrain,Ytrain) Xt = Xtest[:20] p1 = reg1.predict(Xt) p2 = reg2.predict(Xt) p3 = reg3.predict(Xt) p_final = (p1+p2+p3)/3 plt.figure(figsize=(8,5)) plt.plot(p1, "gd", label="KNeighborsRegressor") plt.plot(p2, "b^", label="DecisionTreeRegressor") plt.plot(p3, "ys", label="LinearRegression") plt.plot(p_final, "r*", ms=10, label="average") plt.plot(Ytest[:20],"ko",label="Label") plt.xticks(range(20)) plt.ylabel("predicted") plt.xlabel("training samples") plt.legend(loc=1, bbox_to_anchor=(1.4,1.0)) plt.grid(axis='x') plt.title("Regressor predictions and their average") plt.show()
print(reg1.score(Xt,Ytest[:20])) print(reg2.score(Xt,Ytest[:20])) print(reg3.score(Xt,Ytest[:20])) from sklearn.metrics import r2_score r2_score(Ytest[:20],p_final)
2.3 加权平均法💢
这个是平均法的改进版,指的是给不同模型加上不同的权重,这个可以定义每个模型对于预测结果的重要性。一般来说,弱分类器效果好的我们会给更高的权重。需要注意的是,所有弱分类器的权重之和等于1。
print(reg1.score(Xt,Ytest[:20])) print(reg2.score(Xt,Ytest[:20])) print(reg3.score(Xt,Ytest[:20])) 0.38569680255687555 0.4245152879688403 0.5350833277174876 p_Wfinal = p1*0.2+p2*0.2+p3*0.6 r2_score(Ytest[:20],p_Wfinal)
机器学习中的集成学习(二)+https://developer.aliyun.com/article/1544763?spm=a2c6h.13148508.setting.15.22454f0eHFZZj3