机器学习中的集成学习(一)

简介: 集成学习是一种将多个弱学习器组合成强学习器的方法,通过投票法、平均法或加权平均等策略减少错误率。它分为弱分类器集成、模型融合和混合专家模型三个研究领域。简单集成技术包括投票法(用于分类,少数服从多数)、平均法(回归问题,预测值取平均)和加权平均法(调整模型权重以优化结果)。在实际应用中,集成学习如Bagging和Boosting是与深度学习并驾齐驱的重要算法,常用于数据竞赛和工业标准。

💬内容概要


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)
# 0.9707602339181286
 
 
 
print(model1.score(Xtest,Ytest))
print(model2.score(Xtest,Ytest))
print(model3.score(Xtest,Ytest))
 
 
 
# 0.9473684210526315
# 0.9298245614035088
# 0.9532163742690059


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)
 
 
# 对测试集中前20个样本进行预测
Xt = Xtest[:20] 
p1 = reg1.predict(Xt)
p2 = reg2.predict(Xt)
p3 = reg3.predict(Xt)
 
 
# 使用平均法得到最终预测结果
p_final = (p1+p2+p3)/3
 
 
# 绘制前20个样本的可视化结果
 
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]))
 
# 0.38569680255687555
# 0.4245152879688403
# 0.5350833277174876
 
 
 
from sklearn.metrics import r2_score
r2_score(Ytest[:20],p_final)
 
 
 
# 0.4956095743088209


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)
 
# 0.5208586019573234



机器学习中的集成学习(二)+https://developer.aliyun.com/article/1544763?spm=a2c6h.13148508.setting.15.22454f0eHFZZj3

相关文章
|
5天前
|
机器学习/深度学习 算法 前端开发
机器学习中的集成学习(二)
**集成学习概述** 集成学习通过结合多个弱学习器创建强学习器,如Bagging(Bootstrap Aggregating)和Boosting。Bagging通过随机采样产生训练集,训练多个弱模型,然后平均(回归)或投票(分类)得出结果,减少方差和过拟合。Boosting则是迭代过程,每个弱学习器专注于难分类样本,逐步调整样本权重,形成加权平均的强学习器。典型算法有AdaBoost、GBDT、XGBoost等。两者区别在于,Bagging模型并行训练且独立,而Boosting模型间有依赖,重视错误分类。
|
5天前
|
机器学习/深度学习 人工智能 算法
AI - 集成学习
集成学习是一种机器学习策略,它通过组合多个模型(称为基学习器)来创建一个更强大、更稳健的预测模型。基学习器可以是不同类型或同类型的模型,如决策树、SVM、神经网络等。
|
5天前
|
机器学习/深度学习 算法 前端开发
集成学习思想
**集成学习**是通过结合多个预测模型来创建一个更强大、更鲁棒的系统。它利用了如随机森林、AdaBoost和GBDT等策略。随机森林通过Bootstrap抽样构建多个决策树并用多数投票决定结果,增强模型的多样性。Boosting,如Adaboost,逐步调整样本权重,使后续学习器聚焦于前一轮分类错误的样本,减少偏差。GBDT则通过拟合残差逐步提升预测精度。这些方法通过组合弱学习器形成强学习器,提高了预测准确性和模型的鲁棒性。
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】集成语音与大型语音模型等安全边界探索
【机器学习】集成语音与大型语音模型等安全边界探索
218 5
|
1天前
|
人工智能 自然语言处理 机器人
大模型训练的艺术:从预训练到增强学习的四阶段之旅
大模型训练的艺术:从预训练到增强学习的四阶段之旅
|
8天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】Apriori算法在关联规则学习中的应用
【机器学习】Apriori算法在关联规则学习中的应用
37 0
|
7天前
|
消息中间件 Java Kafka
集成Kafka到Spring Boot项目中的步骤和配置
集成Kafka到Spring Boot项目中的步骤和配置
36 7
|
7天前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
68 5
|
7天前
|
Java 数据库连接 mybatis
在Spring Boot应用中集成MyBatis与MyBatis-Plus
在Spring Boot应用中集成MyBatis与MyBatis-Plus
41 5
|
7天前
|
前端开发 JavaScript 安全
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
27 4

热门文章

最新文章