随机森林 bagging袋装法(基于bootstrap重抽样自举法)的原理与python实现——机器学习笔记之集成学习 Part 1

本文主要是介绍随机森林 bagging袋装法(基于bootstrap重抽样自举法)的原理与python实现——机器学习笔记之集成学习 Part 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

* * *  The Machine Learning Noting Series  * * *

导航

1 Bootstrap重抽样自举法

2 袋装法(Bagging)

3 随机森林

4 python实现——一个实例

⚫袋装法和随机森林过程基本一样,都是根据bootstrap的一系列样本分别建立决策树,然后用这些决策树投票出结果。最大区别,也就是随机森林更好的原因在于:随机森林在建立决策树时的分组变量存在随机性。

⚫建立大量模型进行投票得出的估计为真值的无偏及一致估计,由此得到的测试误差也是泛化误差真值的无偏估计。

1 Bootstrap重抽样自举法

🍿🍿🍿Bootstrap重抽样自举法的原理与python实现的详细说明,点击参考我的这篇文章。简单介绍:

概念:重抽样自举法(Bootstrap)也叫做自助抽样法或者0.632自举法。

方法:对N个样本,进行B次有放回的重抽样形成B个样本,每个样本包含N个数据。

0.632?:每个样本,每次抽样被抽到的概率为1/N,抽不到的概率为1-1/N,因此N次均未被抽到的概率为\left ( 1-\frac{1}{N} \right )^{N}\approx \frac{1}{e}= 0.368,故整体上也有1-36.8%=63.2%的样本可作为自举样本。

作用:用于估计统计量的标准误(srandard error),比如回归中回归系数的标准误。

2 袋装法(Bagging)

说明:袋装法Bagging 为Bootstrap Aggregating 的缩写,在单个学习器(基于单个bootstrap样本构建的模型,这里是决策树,也可以是贝叶斯分类器,K-邻近等模型)具有高方差和低偏差时很有效。

方法

 测试误差的估计:

  • 应对每个样本观测,得到其作为OOB时基础学习器所给出的预测结果。即若样本观测在建模过程中有q次作为OOB观测,则只有q个基础学习器提供预测值,最终预测结果是这个q值的均值或投票。
  • 袋装法可方便的计算出OOB测试误差,而不必再用其他样本划分方法。
  • 自举次数越多,即建立的估计模型越多,越有助于降低方差,消除测试误差计算结果的随机性。

输入变量重要性的度量:

基于多棵树计算输入变量重要性:计算B棵树异质性下降总和,总和的最大值对应的输入变量重要性最高。

随机森林

原理:独立同分布的B个预测值(由上文的B个学习器产生)Z_{i},i=1,2,...,N,若其方差为\sigma ^{2},两两相关系数为\rho,那么投票结果,即Z的均值的方差为:

Var\left (\overline{Z} \right )=Var\left ( \frac{1}{N} \sum_{i=1}^{N} Z_{i}\right ) = \frac{1}{N} \left [ N\sigma ^{2}+N(N-1))\rho \sigma ^{2} \right ]=\frac{\sigma ^{2}+(N-1)\rho \sigma ^{2}}{N}=\rho \sigma ^{2}+\frac{1-\rho }{N}\sigma ^{2}

袋装法通过增加B来减少方差(上式结果后半部分),在此次基础上,随机森林则进一步通过减少相关性(降低树间的相似性)来降低方差(上式结果前半部分)。

随机森林的随机体现在:①样本随机性,来自于Bootstrap的随机抽样;②属性随机性,树的生成随机选择分类属性。

方法

输入变量重要性的度量

基本思路是,若某个变量影响力大,那么同样的随机噪声,该变量随模型OBB结果影响更大。为了测度重要性,首先计算\widehat{T}^{*(b)} \left ( b=1,2,...,B \right )的OOB测试误差,记为e\left (\widehat{T}^{*(b)} \right )。为了测度第j个输入变量对输出变量的重要性:

1) 随机打乱\widehat{T}^{*(b)}的OOB在第j个输入变量上的取值顺序,重新计算\widehat{T}^{*(b)}基于OOB的测试误差,记为e^{j}\left (\widehat{T}^{*(b)} \right ).

2) 计算第j个输入变量添加噪声后\widehat{T}^{*(b)}的OOB误差的变化:c_{\widehat{T}^{*(b)}}^{j}=e^{j}\left (\widehat{T}^{*(b)} \right )-e\left (\widehat{T}^{*(b)} \right ).

重复上述步骤B次,得到B个c_{\widehat{T}^{*(b)}}^{j},( b=1,2,...,B ),计算其均值\frac{1}{B}\sum_{b=1}^{B}c_{\widehat{T}^{*(b)}}^{j},这就是第j个输入变量添加噪声后随机森林的OOB误差的变化,该误差值越大,表明变量越重要。

随机森林和袋装法的比较

在输入变量较多的情况下,随机森林的优势会更加明显。下图为4个输入变量时不同方法的测试误差变化情况,可以看出随着树数的增加,随机森林的误差最小。具体可见下面的python实例。

4 python实现——一个实例

下面的例子同时实现袋装法和随机森林,并比较其性能。该例子为PM2.5浓度的回归预测,需要数据可向我索要。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error
import xgboost as xgb
# 准备数据
data=pd.read_excel('北京市空气质量数据.xlsx')
data=data.replace(0,np.NaN)
data=data.dropna()
data=data.loc[(data['PM2.5']<=200) & (data['SO2']<=20)]
X=data[['SO2','CO']]
Y=data['PM2.5']
X0=np.array(X.mean()).reshape(1,-1)
# 运行袋装法和随机森林
modelDTC = tree.DecisionTreeRegressor(max_depth=5,random_state=123)
dtrErr=1-cross_val_score(modelDTC,X,Y,cv=10,scoring='r2')
BagY0=[]
bagErr=[]
rfErr=[]
rfY0=[]
for b in np.arange(10,200):Bag=ensemble.BaggingRegressor(base_estimator=modelDTC,n_estimators=b,oob_score=True,random_state=123,bootstrap=True)Bag.fit(X,Y)bagErr.append(1-Bag.oob_score_)BagY0.append(float(Bag.predict(X0)))RF=ensemble.RandomForestRegressor(n_estimators=b,oob_score=True,random_state=123,bootstrap=True,max_features="sqrt")RF.fit(X,Y)      rfErr.append(1-RF.oob_score_)     rfY0.append(float(RF.predict(X0)))
# 可视化结果
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,4))
axes[0].axhline(y=dtrErr.mean(),linestyle='-.',label='回归树')
axes[0].plot(np.arange(10,200),bagErr,linestyle='-',label='Bagging回归树(方差=%.3f)'%np.var(BagY0))
axes[0].plot(np.arange(10,200),rfErr,linestyle='--',label='随机森林(方差=%.3f)'%np.var(rfY0))
axes[0].set_title("回归树、Bagging回归树和随机森林")
axes[0].set_xlabel("树的棵树B")
axes[0].set_ylabel("测试误差")
axes[0].legend()axes[1].barh(y=(1,2,3,4),width=RF.feature_importances_,tick_label=X.columns)
axes[1].set_title("输入变量的重要性")
for x,y in enumerate(RF.feature_importances_):    axes[1].text(y+0.01,x+1,'%s' %round(y,3),ha='center')

结果如下图所示,可以看出,当输入变量较多时,随着树数的增加,随机森林的优势逐渐显现,测试误差更低。

这篇关于随机森林 bagging袋装法(基于bootstrap重抽样自举法)的原理与python实现——机器学习笔记之集成学习 Part 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785172

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和