随机森林-Random Forest
本文作者:陈 鼎,中南财经政法大学统计与数学学院
本文编辑:张孟晗
技术总编:陈 鼎
Stata&Python云端课程来啦!
为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于9月1日起调价,Python课程的价格调整为199.9元,Stata进阶课程调为199.9元,Stata基础课程调整到229.9元,Stata文本分析、正则表达式、网络爬虫、基本字符串课程调整至79.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦
导读
随机森林是浅层学习中基于树学习器的一种算法,它的名字恰好反应了这个算法的核心本质,由多个树结构组成“森林”。随机森林之所以有“随机”二字,是因为这个算法在训练过程中既采用了“行随机”,也采用了“列随机”的概念。在接下来的原理讲解中,将为大家介绍Random Forest“随机”的本质是什么。一、概念介绍
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为特征个数),这便是随机森林的列随机。
三、算法应用
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#导入所需要的包以及样本训练集iris data
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
#建立random forest模型
model = RandomForestClassifier(n_estimators=100, oob_score=True, n_jobs=1, verbose=1, random_state=123)
#设置样本训练集的x与y
data = 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_))
腾讯课堂课程二维码
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
复原之神--preserve&restore
合并,“纵”享新丝滑:frameappend & xframeappend什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts
Stata助力疫情打卡管理——是谁没有接龙呢?
这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?【案例展示】Python与数据库交互
学好这一手,英语词典常在手玩转Stata中的数学函数
用spmap看中国空气质量戳穿围城面具:安利&劝退一个专业
走进图文并茂的攻略世界
玩转word文档“大变身”——wordconvert
简述递归
OpenCV库——轻松更换证件照背景色800万年薪!还有谁?!
千古伤心词人,词伤几何?
去哪儿网攻略爬取——跟我一起去大理吧
"有你才有团"——Stata爬取王者荣耀英雄海报
如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫
利用Python构建马科维茨有效边界
rangestat,让统计量灵活滚动起来!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用Stata画的三维图很奇怪怎么办?
如何随机生成满足特定数据特征的新变量?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为
作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。