查看原文
其他

随机森林-Random Forest

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈   鼎,中南财经政法大学统计与数学学院

本文编辑:张孟晗

技术总编:陈   鼎

Stata&Python云端课程来啦!

为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于9月1日起调价,Python课程的价格调整为199.9元Stata进阶课程调为199.9元Stata基础课程调整到229.9元Stata文本分析正则表达式网络爬虫基本字符串课程调整至79.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦 对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

导读

随机森林是浅层学习中基于树学习器的一种算法,它的名字恰好反应了这个算法的核心本质,由多个树结构组成“森林”。随机森林之所以有“随机”二字,是因为这个算法在训练过程中既采用了“行随机”,也采用了“列随机”的概念。在接下来的原理讲解中,将为大家介绍Random Forest“随机”的本质是什么。

一、概念介绍

在介绍原理之前,如果您有空,可以先复习一下CART树,因为常见随机森林算法是基于CART树模型的。正因如此,从数据角度来看,Random Forest既可以接受连续变量,也可以接受离散变量作为特征输入;同时,它既可以解决分类问题(classification),也可以解决回归问题(regression)。

二、算法原理

(一)算法原理与基本概念

如果用一句话来概括随机森林算法的精髓,那便是我们在日常生活中听到的一句话——“我们投票吧,少数服从多数”。是的,这个看似复杂的算法,其本质上就是通过将一些独立的弱学习器(单一CART树模型)所预测出来的结果,通过多数投票原则(分类)或者取均值(回归)来拟合最终的预测值。

举例1:若我们有一个随机森林分类模型,该模型中的100个树对某一个样本的预测分类为80个1,20个0,那么这个样本的分类就会被预测为1

举例2:若我们有个随机森林回归模型,该模型中的100个树对某一个样本的预测算术平均值为1.5,那么这个样本的y就会被预测为1.5

这就是为什么数据科学家会把Random Forest归为bagging中的一类算法——因为bagging的含义就是将一系列独立的基学习器进行组合,将其输出的结果集进行多数投票或者取均值作为最后预测的y值。

另一个概念需要读者思考一下。随机森林在训练的时候采用了一个叫bootstrap的采样方式。什么是bootstrap?这个词的本义是“靠自己努力”的意思,在机器学习领域中其实指的是一种选择训练集的方式,即sampling withreplacement(有放回采样)。bootstrap法又称为自助法,假设给定的数据集包含d个样本。该数据集有放回地抽样m次,产生m个样本的训练集。这样原数据样本中的某些样本很可能在该样本集中出现多次。没有进入该训练集的样本最终形成检验集(测试集)。显然每个样本被选中的概率是1/m,因此未被选中的概率就是(1-1/m),这样一个样本在训练集中没出现的概率就是m次都未被选中的概率,即(1-1/m)^m。当m趋于无穷大时,这一概率就将趋近于e^-1=0.368,所以留在训练集中的样本大概就占原来数据集的63.2%。

让我们举个例子展示一下。

假设我们需要从1-10这10个自然数中抽取10个随机样本:

若采取sampling without replacement:[5, 8, 1, 9, 2,10, 3, 7, 4, 6]:这种方式抽取的随机值的集合即为原始集合;

若采取sampling with replacement:[5, 1, 1, 2, 10,7, 3, 9, 9, 3] ;利用bootstrap抽取的集合的元素个数一般为原始集合元素的2/3, 即一定会约33%的数据不会被抽取出来,这部分数据就可以用来进行out-of-bag的模型检验(out-of-bag的意思是某数据不会在训练过程中被使用),充当模型的测试集。

这下也许你就明白了随机森林算法训练CART决策树的抽样方法。是的,在每一个决策树的训练过程中,样本都是从原始样本中通过bootstrap的方式随机抽取出来的,这就保证了每次一定会有一部分数据会作为out-of-bag的样本,这便是先前所说的“行随机”。而这样就可以帮助我们在模型训练完后直接评估模型的out-of-bag-error。同时这样做会相比通过交叉验证法得到out-of-bag-error的方式更加地节省时间。

那么“列随机”又是什么意思呢?其实这个概念也很好理解。我们知道在训练单个CART树的时候,通常每个节点在进行分裂的时候会把每一个特征都遍历一遍,看哪个特征能最大幅度地带来信息增益或信息增益比。虽然随机森林算法中也有类似的过程,但注意随机森林中每次进行节点分裂的时候,算法只会考虑所有特征中的一部分进行遍历(通常情况为n^0.5,n为特征个数),这便是随机森林的列随机。

(二)伪代码
在理解了“少数服从多数”、“行随机”、“列随机”等概念后,我们终于可以来看一下randomforest的伪代码了

让我们一步步来解释:
1.for循环用来训练所需要的子树个数,其中B为设置的子树个数,这一步可以进行并行训练;
2.bootstrap sample的目的是为了获得训练子树的训练集,样本量可以与原始样本量相同也可以略小一点(这便是行随机);
3.进行CART树的训练,并不是遍历所有的特征,而是随机选择一部分特征进行信息增益的计算,并选择信息增益最大的特征进行左右树的分裂(这便是列随机);
4.完全训练一个完整的CART树,一般不需要进行剪枝;
5.重复以上步骤直至训练完所有子树;
6.若进行回归,则将每个子树的预测值求算数平均值;若进行分类,则取所有子树所预测类别的众数作为最后的预测类别。

三、算法应用

说完了随机森林算法的理论,让我们来看一下python的sklearn包中,对于RandomForest模型的建立方法。
(一)参数设定与解释
随机森林的重要参数有如下几个:
- criterion: 选择计算每次分裂中最右节点的方式,选项有"gini"(基尼系数)和“entropy”(交叉熵)
- n_estimators: 随机森林中产生CART决策树的个数,理论上来讲,数量越大的话,效果一般会越好,但是训练速度会较慢,而且模型导出后会比较占存储空间。一般在探索阶段建议设置在50~100个
- bootstrap: 默认为True,sampling with replacement(有放回的采样)
- max_features:每次分裂时需要遍历的特征数量,默认为特征数量的开方,也可调节为"log2",即取以2为底的对数
- verbose:默认为0(不显示),设置为1后可以显示任务进程,即花了多少秒来构造树
- n_jobs:非常重要的参数,代表开启的线程数;由于RandomForest中每个树是独立存在的,因此可以进行多线程并行训练。这个参数并不是越大越好,因为开启线程本身也需要花时间,因此建议设置为-1,即电脑CPU的核数。
- oob_score: 如果需要查看模型的oob_socre, 可以设置为True
(二)模型验证
由于随机森林模型采用bootstrap采样方式训练模型,因此对于模型准确性的验证十分方便。读者只需要在训练模型时将oob_score这个参数设置为True,在训练完之后就可以用print(model.oob_score_)将oob的分数打印出来了,分数越高表示模型的out-of-sample/out-of-bag准确性越好。
(三)利用sklearn建立RandomForest模型(以iris data作为实例)
#导入所需要的包以及样本训练集iris datafrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_iris #建立random forest模型model = RandomForestClassifier(n_estimators=100, oob_score=True, n_jobs=1, verbose=1, random_state=123) #设置样本训练集的x与ydata = load_iris()x = data['data']y = data['target'] #训练模型model.fit(x, y) #展示模型oob分数print(round(model.oob_score_, 3))
#展示模型中变量重要性print(*zip(['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], model.feature_importances_))




最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。 




腾讯课堂课程二维码








                    


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐

复原之神--preserve&restore

         合并,“纵”享新丝滑:frameappend & xframeappend
什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts 

Stata助力疫情打卡管理——是谁没有接龙呢?

这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?

【案例展示】Python与数据库交互

学好这一手,英语词典常在手 

玩转Stata中的数学函数

用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

简述递归

OpenCV库——轻松更换证件照背景色

800万年薪!还有谁?!

千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

善用dataex命令,高效沟通你我他

用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里

作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存