RF模型(随机森林模型)详解

初入菜鸟,希望能通过做笔记的方式记录下自己学到的东西,也希望能对同样入门的人有所帮助。希望大佬们帮忙指正错误~侵权立即删除。

内容

一、RF背景——集成(ensemble)学习(Ensemble learning)中的bagging流(stream)派

1、集成(ensemble)学习(Ensemble learning)简介

2、bagging流(stream)派算法简介

(1)算法结构图

(2)算法步骤

(3)OOB(袋外数据)& 泛化(Generalization)能力

二、RF模型算法原理

1、RF Vs bagging

2、算法步骤

三、RF模型的优缺点

1、优点

2、缺点

四、RF的变式——extra trees

五、代码实现RF模型

一、RF背景——集成(ensemble)学习(Ensemble learning)中的bagging流(stream)派

RF模型属于集成(ensemble)学习(Ensemble learning)中的bagging流(stream)派,可以说是bagging的进化版

1、集成(ensemble)学习(Ensemble learning)简介

集成(ensemble)学习(Ensemble learning)分为2派:

(1)boosting:它组合多个弱学习器(Learner)(Weak learner)形成一个强学习器(Learner),且各个弱学习器(Learner)(Weak learner)之间有依赖(dependency)关系。

(2)bagging:同样的,它也是组合多个弱学习器(Learner)(Weak learner)形成一个强学习器(Learner),但它各个弱学习器(Learner)(Weak learner)之间没有依赖(dependency)关系,而且可以并行拟合。

2、bagging流(stream)派算法简介

(1)算法结构图

RF模型(随机森林模型)详解

(2)算法步骤

🌳从原始样本集(包含M个样本)中抽取k个采样(Sampling)集

每个采样(Sampling)集的生成是使用随机采样(Sampling)(bootsrap)的方法抽取M个训练样本(有放回的抽样:所以可能被重复抽取)

进行k轮抽取,得到k个采样(Sampling)集。(k个采样(Sampling)集之间是相互独立的(independent))

🌳分别对这k个采样(Sampling)集进行训练形成对应的k个弱学习器(Learner)(Weak learner)

🌳将这k个弱学习器(Learner)(Weak learner)模型输出通过结合策略得到最终的模型输出

组合策略:

对于分类问题:通常使用简单投票,得票最多的类别或类别之一是最终的模型输出。

对于回归(Regression)问题:通常使用简单平均法,对k个弱学习器(Learner)(Weak learner)得到的回归(Regression)结果进行算术平均得到最终的模型输出。

(3)OOB(袋外数据)& 泛化(Generalization)能力

🌳OOB:即Out of Bag(袋外数据)

上面我们提到“每个采样(Sampling)集的生成是使用随机采样(Sampling)(bootsrap)的方法抽取M个训练样本”。

那么原始数据集(Dataset)中任意一个样本被抽取出来的概率是1/M,没被抽取出来的概率为1-1/M。

那么M次采样(Sampling)都没抽中的概率就为RF模型(随机森林模型)详解

当m→∞时,p→1/e,约等于0.368

那么在每轮采样(Sampling)集的生成中大约有36.8%的数据没有被采样(Sampling)集采集中,这部分数据被称为袋外数据。

🌳OOB的作用

因为这些数据不参与样本集模型的拟合,所以可以用来检验模型的泛化(Generalization)能力

🌳 泛化(Generalization)能力

由于Bagging算法每次都进行采样(Sampling)来训练模型,因此泛化(Generalization)能力很强,对降低模型的方差很有效。当然对于训练集(采样(Sampling)集)的拟合程度就会差一些,也就是模型的偏差(Bias 偏置 )会大一些。

二、RF模型算法原理

1、RF Vs bagging

RF用了改进的CART决策树(Decision tree)来作为弱学习器(Learner)(Weak learner)

(1)CART决策树(Decision tree)

CART决策树(Decision tree)是在给定输入(input)随机变量(random variable)X的条件下输出随机变量(random variable)Y的条件概率(conditional probability)分布(Distribution)的学习方法

CART假设(Hypothesis)决策树(Decision tree)全是二叉树(即其结点只有两种选择:“是” or “否”):决策树(Decision tree)递归二分每个特征,最终得到决策树(Decision tree),通过不断的划分,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布(probability distribution)(Distribution)

因此CART就是递归构建二叉树,但是对于分类和回归(Regression)问题使用的策略是不一样的:

对于回归(Regression)树,使用最小平方误差;对于分类树,使用基尼指数(Gini index)最小化准则(criterion) ()。

(2)RF中的CART决策树(Decision tree)

普通决策树(Decision tree):在节点上所有的n个样本特征中选择一个最优特征来作为决策树(Decision tree)的左右子树划分

RF:随机选择节点上的一部分样本特征,假设(Hypothesis)为t个特征(t

t越小——模型越稳定(模型方差变小),但对于训练集的拟合程度会变差(偏差(Bias 偏置 )变大)

所以在实际案例中,一般会通过交叉验证(Cross validation)调参(Parameter tuning)获取一个合适的t

注:分类问题中,t默认取\sqrt{M};回归(Regression)问题中,默认取M/3

2、算法步骤

(1)从原始样本集(包含M个样本)中抽取k个采样(Sampling)集

每个采样(Sampling)集的生成是使用随机采样(Sampling)(bootsrap)的方法抽取M个训练样本(有放回的抽样:所以可能被重复抽取)

进行k轮抽取,得到k个采样(Sampling)集。(k个采样(Sampling)集之间是相互独立的(independent))

(2)分别对这k个采样(Sampling)集进行训练形成对应的k个弱学习器(Learner)(Weak learner)

在训练决策树(Decision tree)模型的节点时,从节点上的所有样本特征中选择一部分样本特征(如果被选中,则不会放回去),并从这部分样本特征中选择一个最优特征作为决策树(Decision tree)的左右子节点。树划分

判断特征的重要性:

🎈对整个随机森林,得到相应OOB,然后计算OOB误差,记为errOOB1

🎈随机对OOB所有样本的特征X加入噪声干扰(即可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2

🎈假设(Hypothesis)森林中有N棵树,则特征X的重要性 = (∑errOOB2−errOOB1)/N

(3)将这k个弱学习器(Learner)(Weak learner)模型输出通过结合策略得到最终的模型输出

组合策略:

对于分类问题:通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。(RF通常处理的是分类问题)

对于回归(Regression)问题:通常使用简单平均法,对k个弱学习器(Learner)(Weak learner)得到的回归(Regression)结果进行算术平均得到最终的模型输出。

刚刚不是说有OOB嘛~派上用场啦

🌳对OOB样本中的每个样本,计算对应决策树(Decision tree)对它的分类情况;

🌳 然后使用简单多数票作为样本的分类结果;

🌳最后用误分个数占样本总数的比率作为随机森林的oob误分率。

三、RF模型的优缺点

1、优点

RF善于处理高维数据,特征遗失数据,和不平衡数据

(1)训练可以并行化,速度快

(2)对高维数据集(Dataset)的处理能力强,它可以处理成千上万的输入(input)变量,并确定最重要的变量,因此被认为是一个不错的降维(dimensionality reduction)方法。

(3)在训练集缺失数据时依旧能保持较好的精度(原因:RF随机选取样本和特征;RF可以继承决策树(Decision tree)对缺失数据的处理方式)

(4)泛化(Generalization)能力强,因为随机

2、缺点

(1)在解决回归(Regression)问题时效果不是很好

RF不能给出一个连续的输出,而且RF不能做出超越训练集数据范围的预测,这可能会导致在训练含有某些特定噪声的数据时出现过拟合(Overfitting)

(2)对特征数比较少的数据,它的随机性不好发挥,效果不太好

四、RF的变式——extra trees

改进点:

1、extra trees的每个决策树(Decision tree)采用原始训练集

2、extra trees随机选择一个特征值(eigenvalue)来划分决策树(Decision tree)

五、代码实现RF模型

我们可以调用sklearn里面现成的RF模型来实现

🌳 首先导入需要的库

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier #导入随机森林模型
from sklearn.datasets import load_boston #让我们利用sklearn里现有的boston数据
from sklearn.model_selection import train_test_split#用来进行训练集和测试集的自动分配

🌳我们这里使用sklearn里的boston数据

boston = load_boston()#导入boston数据

🌳我们把数据变成DataFrame类型,这样比较好处理,我们看起来也比较清晰

bos = pd.DataFrame(boston.data, columns = boston.feature_names)
bos['MEDV'] = boston.target
print(bos)
print(bos.columns)

数据变成了这样

RF模型(随机森林模型)详解

🌳让我们把数据变为numpy类型再送进train_test_split进行训练集和测试集的分配

y = np.array(bos['MEDV']) #目标
x = bos.drop(['MEDV'], axis=1)#去除目标后的所有数据作为输入(input)
x = np.array(x)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)#分成80%训练,20%测试

🌳 模型配置和训练

rf = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)#RF模型设置
rf.fit(x_train, y_train.astype('int'))#把数据送进去训练

🎈RandomForestClassifier函数

n_estimators :森林里决策树(Decision tree)的数目,默认是10

random_state:随机数生成器(Generator)使用的种子

n_jobs:用于拟合和预测的并行运行的工作数量。如果值为-1,那么工作数量被设置为核的数量

🌳输出预测后的每个特征对于MEDV的重要性

a = rf.feature_importances_
print(boston.feature_names)
print("重要性:",a)

预测结果

RF模型(随机森林模型)详解

欢迎大家在评论区批评指正,谢谢~

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月25日 下午1:59
下一篇 2022年3月25日 下午2:17

相关推荐