初入菜鸟,希望能通过做笔记的方式记录下自己学到的东西,也希望能对同样入门的人有所帮助。希望大佬们帮忙指正错误~侵权立即删除。
内容
一、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)算法结构图
(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)都没抽中的概率就为
当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默认取 (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)训练可以并行化,速度快 (2)对高维数据集(Dataset)的处理能力强,它可以处理成千上万的输入(input)变量,并确定最重要的变量,因此被认为是一个不错的降维(dimensionality reduction)方法。 (3)在训练集缺失数据时依旧能保持较好的精度(原因:RF随机选取样本和特征;RF可以继承决策树(Decision tree)对缺失数据的处理方式) (4)泛化(Generalization)能力强,因为随机 (1)在解决回归(Regression)问题时效果不是很好 RF不能给出一个连续的输出,而且RF不能做出超越训练集数据范围的预测,这可能会导致在训练含有某些特定噪声的数据时出现过拟合(Overfitting) (2)对特征数比较少的数据,它的随机性不好发挥,效果不太好 改进点: 1、extra trees的每个决策树(Decision tree)采用原始训练集 2、extra trees随机选择一个特征值(eigenvalue)来划分决策树(Decision tree) 我们可以调用sklearn里面现成的RF模型来实现 🌳 首先导入需要的库 🌳我们这里使用sklearn里的boston数据 🌳我们把数据变成DataFrame类型,这样比较好处理,我们看起来也比较清晰 数据变成了这样 🌳让我们把数据变为numpy类型再送进train_test_split进行训练集和测试集的分配 🌳 模型配置和训练 🎈RandomForestClassifier函数 n_estimators :森林里决策树(Decision tree)的数目,默认是10 random_state:随机数生成器(Generator)使用的种子 n_jobs:用于拟合和预测的并行运行的工作数量。如果值为-1,那么工作数量被设置为核的数量 🌳输出预测后的每个特征对于MEDV的重要性 预测结果 欢迎大家在评论区批评指正,谢谢~;回归(Regression)问题中,默认取M/3
2、算法步骤
三、RF模型的优缺点
1、优点
2、缺点
四、RF的变式——extra trees
五、代码实现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#用来进行训练集和测试集的自动分配
boston = load_boston()#导入boston数据
bos = pd.DataFrame(boston.data, columns = boston.feature_names)
bos['MEDV'] = boston.target
print(bos)
print(bos.columns)
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'))#把数据送进去训练
a = rf.feature_importances_
print(boston.feature_names)
print("重要性:",a)
文章出处登录后可见!