集成学习

准确的说,集成学习并不能算是一个真正的机器学习算法,至少其本质上并未引入什么新的学习算法内容。集成学习的总体思想就是通过多个基(弱)学习器共同来完成最终的一个任务。就像以前是一个算法与问题之间的单挑,现在是多个算法(重复或者不重复)群殴一个问题。学术上称之为集成学习或者多分类器系统。
集成学习大致可以分为三种学习方式

这里我们分为了三部分进行介绍,首先介绍Bagging算法思想及其实例,后面文章会分别对Boosting与Stacking进行介绍
下一篇,Boosting,点我
下一篇,Stacking,点我

Bagging

现在我们设想一个简单的分类问题,以前我们采用KNN、DT、SVM等算法进行预测时,只产生了一个基学习器。我们最终的决策结果也将完全的依赖于该学习器。加入现在我们采取对样本放回抽样的方式来进行10次的算法学习,这样我们是不是就得到了10个不同的基学习器呢?不管后续如何使用这么多的基学习器,我们首先得到这些学习器再说。

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split,GridSearchCV
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from math import floor
# 获取数据,这里数据沿用的泰坦尼克号数据,大家可以从这篇文章中的链接处下载该数据
# https://blog.csdn.net/qq_40725653/article/details/117922390?spm=1001.2014.3001.5501
dataset = pd.read_csv(r"E:\Jupyter\Pytorch\ML_Algorithm\Decision_tree\titanic\train.csv")
dataset = dataset.drop(columns=['Name','SibSp','Parch','Ticket','Fare','Cabin','Embarked'])
# 数据简单处理,获取特征与标签
features = dataset.iloc[:,-3:]
target = dataset.loc[:,["Survived"]]
# 缺失值处理,利用平均值填充
for line in features.columns:if np.any(features[line].isnull())==True:features[line].fillna(value=floor(round(features[line].mean(),1)),inplace=True)from sklearn.feature_extraction import DictVectorizer
# 数据分割
x_train,x_test,y_train,y_test = train_test_split(features,target,test_size=0.2,random_state=1)
# 特征工程
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
# 设置模型,十倍交叉验证
cif = BaggingClassifier(base_estimator=DecisionTreeClassifier(),bootstrap=False,bootstrap_features=True,random_state=2)
# 这里可以更改基础算法
#cif = BaggingClassifier(base_estimator=SVC(),bootstrap=False,bootstrap_features=True,random_state=2)
params = {'n_estimators':[10,50,100,150,200]}
cif = GridSearchCV(estimator=cif,param_grid=params,cv=10)
# 训练
y_train = np.array(y_train).ravel()
y_test = np.array(y_test).ravel()
cif.fit(x_train,y_train)# 预测
y_pred = cif.predict(x_test)
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test,y_pred))

Voting

通过上述的方法我们可以分别生成多种基本模型,下面我们假设已经针对同一个分类问题生成了DT、RF、SVM三种基本学习器。那么就会有三种输出结果,但我们最终只需要一个标签,那么我们如何将多种输出进行拟合,最终生成一个标签呢?结合策略

结合策略1:平均法,针对于回归类型等数值型输出任务,最为常见的策略就是采用简单平均法
1:简单平均法
H(x)=1T∑i=1Thi(x)H(x)=\dfrac{1}{T}\sum_{i=1}^Thi(x)H(x)=T1​∑i=1T​hi(x)
2:加权平均法
H(x)=∑i=1Twihi(x)H(x)=\sum_{i=1}^Tw_ih_i(x)H(x)=∑i=1T​wi​hi​(x)
其中wiw_iwi​是单个学习器hih_ihi​的权重,通常要求wi≥0,∑i=1T=1w_i≥0,\sum_{i=1}^T=1wi​≥0,∑i=1T​=1,其中权重一般是从训练数据中学习得来的。投票法中也有类似机制,将在boosting中进行详细的讲解

结合策略2:投票法,针对于分类问题从类别标记集合中通过某种投票方式预测出一个标记作为该类别输出。
在bagging算法中,采取了平权投票的方式。即生成的每个学习器赋予相同的权重,每个基学习器都投出等权重的一票,最终根据总的结果最终判定所属类别。常见的有硬投票(hard voting)/软投票(softvoting)两种常见的结合投票方法。
1:硬投票,谁得票数最多就属于哪一类
2:软投票,首先得有概率输出,最终计算全部学习器的权重*预测概率得出预测为每个类别的概率,最终哪一类概率输出大就属于哪一类。相当于是对后验概率P(ci∣x)P(c_i|x)P(ci​∣x)(cic_ici​:预测类别,x:样本)的一个估计。

# 前面的导入也要用
from sklearn.metrics import plot_roc_curve
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 生成决策树,SVM,随机森林学习器
tree = DecisionTreeClassifier(criterion="gini",max_depth=3,random_state=1)
tree.fit(train_set,train_target)forest = RandomForestClassifier(n_estimators=100,criterion="gini",max_depth=3,random_state=2)
forest.fit(train_set,train_target)svc = SVC(C=1.0,kernel="rbf",degree=3,random_state=3,probability=True)
svc.fit(train_set,train_target)from sklearn.ensemble import VotingClassifier
# 生成投票分类器,利用关键词参数voting=‘soft‘/'hard'控制软硬投票
vote = VotingClassifier(estimators=[('dt',tree),('rf',forest),('svc',svc)],voting="soft")
vote.fit(train_set,train_target)clf = [tree,forest,svc,vote]
for model in clf:model.fit(train_set,train_target)y_pred = model.predict(test_set)score = accuracy_score(test_target,y_pred)print(model.__class__.__name__,score)
# 顺带绘制下他们的roc曲线
ax = plt.gca()
ax.grid(linestyle="dashed",alpha=0.6)
svc_display = plot_roc_curve(tree,test_set,test_target,ax=ax,color="red")
forest_display = plot_roc_curve(forest,test_set,test_target,ax=ax)
tree_display = plot_roc_curve(tree,test_set,test_target,ax=ax)
plt.show()

注意事项:启用软投票必须有概率估计。我们常见的决策树,随机森林都会计算概率,而SVM依靠距离进行分类,因此
我们需要启动probability=True(启用概率估计)

Random Forest(Bagging变形)

随机森林是Bagging的一个扩展变形算法,他就是采取决策树作为基学习器,在决策树的训练过程中引入了随机属性选择(每次m个特征中选取k个特征),从而构建起不同的决策树,最终依赖于多个决策树形成森林来预测最终的结果。

# 与前面代码导入包一样
# 获取数据,这里数据沿用的泰坦尼克号数据,大家可以从这篇文章中的链接处下载该数据
# https://blog.csdn.net/qq_40725653/article/details/117922390?spm=1001.2014.3001.5501
dataset = pd.read_csv(r"E:\Jupyter\Pytorch\ML_Algorithm\Decision_tree\titanic\train.csv")
dataset = dataset.drop(columns=['Name','SibSp','Parch','Ticket','Fare','Cabin','Embarked'])
# 数据简单处理,获取特征与标签
features = dataset.iloc[:,-3:]
target = dataset.loc[:,["Survived"]]
# 缺失值处理,利用平均值填充
for line in features.columns:if np.any(features[line].isnull())==True:features[line].fillna(value=floor(round(features[line].mean(),1)),inplace=True)from sklearn.feature_extraction import DictVectorizer
# 数据分割
x_train,x_test,y_train,y_test = train_test_split(features,target,test_size=0.2,random_state=1)
# 特征工程
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
estimator = RandomForestClassifier(max_features="auto")
param_grid = {"n_estimators":[10,30,50,80,100,120,150,100],"max_depth":[2,4,6,8]}
estimator = GridSearchCV(estimator,param_grid=param_grid,cv=10)
# 训练模型
estimator.fit(train_set,train_target)
# 模型评估
score = estimator.score(test_set,test_target)
estimator.best_estimator_

Bagging总结

1:对数据或者特征进行采样学习
2:学习器平均票权
3:并行学习,各个学习器之间没有较强的依赖性
4:Bagging主要用于降低方差,减少过拟合,来提高模型的泛化性能

下一篇,Boosting,点我
下一篇,Stacking,点我

集成学习与Bagging相关推荐

  1. 集成学习之Bagging

    集成学习之Bagging 1 Bagging集成原理 目标:把下面的圈和方块进行分类 [此时用直线很难把圈和方块分开的] 实现过程: 1.采样不同数据集 2.训练分类器 3.平权投票,获取最终结果 4 ...

  2. 集成学习、Bagging算法、Bagging+Pasting、随机森林、极端随机树集成(Extra-trees)、特征重要度、包外评估

    集成学习.Bagging算法.Bagging+Pasting.随机森林.极端随机树集成(Extra-trees).特征重要度.包外评估 目录

  3. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 可以通过聚集多个分类器的预测结果提高分类器的分类准确率,这一方法称为集成(Ensemble)学习或分类器组合(Classifier C ...

  4. 集成学习:Bagging、随机森林、Boosting、GBDT

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 集成学习:Bagging.随机森林.Boosting.GBDT ...

  5. [白话解析] 通俗解析集成学习之bagging,boosting 随机森林

    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...

  6. 监督学习 | 集成学习 之Bagging、随机森林及Sklearn实现

    文章目录 集成学习 1. 投票分类器 1.1 硬投票法 1.2 软投票法 2. Bagging & Pasting 2.1 包外评估 2.2 Random Patches 和 随机子空间 3. ...

  7. 集成学习(Bagging和Boosting)

    一.概念 集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来. Baggging 和Bo ...

  8. 机器学习(九):集成学习(bagging和boosting),随机森林、XGBoost、AdaBoost

    文章目录 一.什么是随机森林? 1.1 定义 1.2 目的 1.3 随机森林 VS bagging 二.集成学习 2.1 定义 2.2 决策树的问题 2.3 袋装法概念与理论 2.4 装袋法的优缺点 ...

  9. 集成学习(bagging/boosting/stacking)BERT,Adaboost

    文章目录 集成学习(ensemble learning) 1.bagging(装袋法) 2.boosting(提升法) 3.stacking(堆叠法) 集成学习(ensemble learning) ...

  10. [学习笔记] [机器学习] 7. 集成学习(Bagging、随机森林、Boosting、GBDT)

    视频链接 数据集下载地址:无需下载 1. 集成学习算法简介 学习目标: 了解什么是集成学习 知道机器学习中的两个核心任务 了解集成学习中的 Boosting 和 Bagging 1.1 什么是集成学习 ...

最新文章

  1. Linux下Tomcat的安装配置
  2. 我们应该怀念爱因斯坦的五个原因
  3. 计算机专业英语在线测试9,《计算机专业英语》第9章在线测试【DOC精选】.doc
  4. php中rsa加密及解密和签名及验签
  5. C#三层开发做学生管理系统
  6. python3图片转代码_python3图片转换二进制存入mysql示例代码
  7. RTX——第10章 任务调度-抢占式、时间片和合作式
  8. HTML页面中返回顶部的几种实现方式
  9. java私塾设计模式_Java私塾:研磨设计模式 之 访问者模式(Visitor)
  10. OpenCV --- CAMShift对象跟踪
  11. minidump详细介绍
  12. MATLAB中常用的基本数学函数和三角函数
  13. 9550电机_扭矩公式9550是什么 电机扭矩计算公式T=9550P/n怎么算
  14. 天线工程手册_弱电工程人员书籍推荐
  15. 微信小程序——1、搭建自己的Https服务器
  16. 数据分析——数据指标
  17. Unity 鼠标点击事件穿透
  18. 新数据库必须要做一次完全备份之后才能保留日志,在做备份之前还原模式就是简单,不管你选什么!
  19. 【LeetCode】64. 最小路径和 结题报告 (C++)
  20. python找最长的单词_318. 最长单词长度乘积(Python)

热门文章

  1. 图解联邦学习(Federated Learning)
  2. JSP毕设分享 科研信息管理系统
  3. Eclipse IDE 使用技巧 (Eclipse工作空间小技巧)(自己的一些学习笔记和心得,记录下来,备忘录和复习使用)
  4. linux查看软件安装目录
  5. 高防云服务器租用怎么选?
  6. Python自动化软件测试的发展前景及学习路线!
  7. python airflow_airflow 实战总结
  8. JavaScript案例之便利贴
  9. targetTouches、touches、changedTouches的具体区别
  10. xilinx7系列FPGASelectIO篇(2)_IO逻辑资源简介