机器学习之随机森林(手推公式版)
文章目录
- 前言
- 1. 集成学习
- 1.1 Boosting
- 1.2 Bagging
- 2. 随机森林
- 2.1 投票法
- 2.2 平均法
- 3. 模型实现
- 结束语
前言
随机森林(Random(Random(Random Forest,RF)Forest,RF)Forest,RF)是非常具有代表性的BaggingBaggingBagging集成算法,在以决策树为基学习器(评估器)
的基础之上,进一步在决策树的训练过程中引入随机特征选择(不然也不叫“随机”森林了,哈哈哈哈)。本篇博客就来简单介绍一下随机森林的相关知识及其在分类问题上的应用。
基学习器,即若集成器中只包含同种类型的个体学习器,则该个体学习器称为基学习器,相应的学习算法称为基学习算法。
弱学习器,常指泛化性能略优于随机猜测的学习器,即精度略高于50%的学习器。一般基学习器也称为弱学习器。
个体学习器,通常是由一个现有的学习算法从训练数据中产生的。
1. 集成学习
集成学习(Ensemble(Ensemble(Ensemble Learning)Learning)Learning)本身不是一个单独的机器学习算法,而是通过构建并结合多个学习器(评估器)来完成学习任务。集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的分类或回归表现。
1.1 Boosting
BoostingBoostingBoosting是一种可将弱学习器提升为强学习器的算法,所以也称为提升法
,工作机制为:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器预测错的训练样本在后续训练中受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;不断重复上述过程,直至基学习器数目达到实现指定的值,最终将这指定数目的基学习器进行加权结合。
所以,BoostingBoostingBoosting集成算法是一种串行式算法,即后面的基学习器依赖于前面的基学习器。
BoostingBoostingBoosting算法中最著名的代表是AdaBoostAdaBoostAdaBoost算法。
1.2 Bagging
BaggingBaggingBagging是一种并行式的集成算法,即多个基学习器之间没有依赖关系,是相互独立的。如何使基学习器之间相互独立呢?该算法是这样做的:先对训练集进行采样(自助采样法)
,需要多少个基学习器,就采样出多少个训练子集(采样集),然后基于每个采样出来的训练子集来训练一个基学习器,再将这些基学习器进行结合,在对预测输出进行结合时,分类任务通常要采用投票法,回归任务使用平均法。
BaggingBaggingBagging算法中最著名的代表是RFRFRF算法。
自助采样法(Bootstrap(Bootstrap(Bootstrap Sampling)Sampling)Sampling):给定包含mmm个样本的数据集DDD,我们先从中随机选取一个样本放入到采样集D′D^\primeD′中,然后再把该样本放回到原始数据集DDD中,使得下次采样时该样本仍有可能被选中,这样,经过mmm次随机采样操作,我们得到了含mmm个样本的采样集D′D^\primeD′。显然,原始数据集DDD中会有一部分样本在D′D^\primeD′中多次出现,而另一部分样本不会出现。可以做一下简单的估计:每个样本被采样到的概率为1m\frac {1} {m}m1,那么不会被采样到的概率就是1−1m1-\frac {1} {m}1−m1,那么样本在mmm次采样中一次也没被采样到的概率为(1−1m)m(1-\frac {1} {m})^m(1−m1)m,取极限可得limm→∞(1−1m)m=1e≈0.368\lim_{m \to \infty} (1-\frac {1} {m})^m=\frac {1} {e} \approx 0.368m→∞lim(1−m1)m=e1≈0.368
通过自主采样法,初始数据集DDD中约有36.8%的样本未出现在数据集D′D^\primeD′中,于是我们可以将D′D^\primeD′用作训练集,D−D′D-D^\primeD−D′用做测试集,这样的测试称为包外估计(out-of-bag estimate,oob)
。
2. 随机森林
传统决策树在选择划分特征时是在当前结点的特征集合中选择一个最优特征(假设有ddd个特征),而在随机森林中,对基决策树的每个结点,先从该结点的特征集中随机
选择一个包含kkk个特征的子集,然后再从这个子集中选择一个最优特征用于划分。
在上面介绍随机森林的时候我们引入了一个参数kkk来控制随机性的引入程度:若令k=dk=dk=d,则及决策树的构建与传统决策树相同;若令k=1k=1k=1,则是随机选择一个特征进行划分;一般情况下,推荐值 k=log2dk=\log_2dk=log2d。
下面来看看集成算法是如何保证集成的效果一定好于单个学习器的:
假设集成包含TTT个基学习器{h1,h2,…,hT}\{h_1,h_2,\dots,h_T\}{h1,h2,…,hT},其中hih_ihi在示例x\bm xx上的输出为hi(x)h_i(\bm x)hi(x)。
2.1 投票法
对分类任务来说,最常使用的结合策略是投票法(voting)(voting)(voting)。假设类别的集合为{c1,c2,…,cN}\{c_1,c_2,\dots,c_N\}{c1,c2,…,cN},为方便讨论,这里将hih_ihi在样本x\bm xx上的预测输出表示为一个NNN维向量(hi1(x),hi2(x),…,hiN(x),)T\big(h_i^1(\bm x), h_i^2(\bm x), \dots,h_i^N(\bm x), \big)^T(hi1(x),hi2(x),…,hiN(x),)T,其中hij(x)h_i^j(\bm x)hij(x)表示hih_ihi在类别cjc_jcj上的输出。
∙\bullet∙ 绝对多数投票法(majority(majority(majority voting)voting)voting)
H(x)={cj,∑i=1Thij(x)>0.5∑k=1N∑i=1Thik(x)reject,其他H(\bm x)=\begin{cases} c_j, & \sum_{i=1}^Th_i^j(\bm x)>0.5 \sum_{k=1}^N\sum_{i=1}^Th_i^k(\bm x)\\ \\ reject, & 其他 \end{cases}H(x)=⎩⎪⎨⎪⎧cj,reject,∑i=1Thij(x)>0.5∑k=1N∑i=1Thik(x)其他 即若某个标记得票过半数,则预测为该类别,否则拒绝预测。
∙\bullet∙ 相对多数投票法(plurality(plurality(plurality voting)voting)voting)
即预测为得票最多的类别,若同时有多个类别获得最高票,则从中随机选取一个。
∙\bullet∙ 加权投票法(weighted(weighted(weighted voting)voting)voting)
与加权平均法类似
2.2 平均法
对数值型输出hi(x)∈Rh_i(\bm x)\in \mathbb {R}hi(x)∈R,最常见的结合策略是平均法(averaging)(averaging)(averaging)。
∙\bullet∙ 简单平均法(simple(simple(simple averaging)averaging)averaging)
H(x)=1T∑i=1Thi(x)H(\bm x)=\frac {1} {T}\sum_{i=1}^Th_i(\bm x)H(x)=T1i=1∑Thi(x) ∙\bullet∙ 加权平均法(weighted(weighted(weighted averaging)averaging)averaging)
H(x)=1T∑i=1Twihi(x)H(\bm x)=\frac {1} {T}\sum_{i=1}^Tw_ih_i(\bm x)H(x)=T1i=1∑Twihi(x) 其中wiw_iwi是个体学习器hih_ihi的权重,通常要求wi≥0,∑i=1Twi=1w_i\geq 0,\sum_{i=1}^Tw_i=1wi≥0,∑i=1Twi=1。
很显然,简单平均法是加权平均法令wi=1Tw_i=\frac {1} {T}wi=T1的特例。加权平均法的权重一般是从训练数据中学习得到的,现实任务中的训练样本通常不充分或存在噪声,这将使得学习得到的权重不完全可靠。一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
3. 模型实现
这里使用sklearn.ensemble
里的RandomForestClassifier
进行决策树建模来解决分类问题,数据集为sklearn
自带的酒数据集winedata
,数据集详情可参考决策树这篇博客,这里不再叙述。
from sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_winefrom sklearn.model_selection import train_test_split, cross_val_scoreimport matplotlib.pyplot as pltimport pandas as pdwinedata = load_wine()x_train, x_test, y_train, y_test = train_test_split(winedata.data, winedata.target, test_size=0.3, random_state=1024)# n_estimators 森林中树木的数量, 即评估器的数量 往往越大越好[1, 200]# bootstrap 有放回随机抽样 默认为True, 一般保持默认# oob_score True 使用袋外数据来测试模型, 即可以不用划分数据集了# random_state 控制随机森林的生成模式model = RandomForestClassifier(n_estimators=100, criterion='gini', random_state=1024)model.fit(x_train, y_train)score = model.score(x_test, y_test)# score: 0.9815print('score:', score)
我们构建了一个含有100棵决策树的随机森林,在没有调参的情况下,在winedata
数据集上的进度就达到了0.98,明显高于单棵决策树的0.9074。下面来看一下参数n_estimators
对随机森林的影响:
score_list = []for i in range(200):model = RandomForestClassifier(n_estimators=i+1, criterion='gini', random_state=1024)score = cross_val_score(model, winedata.data, winedata.target, cv=10).mean()score_list.append(score)plt.figure(figsize=(20, 5))plt.plot(range(1, 201), score_list)# plt.xticks(range(1, 201))plt.show()
下面不用手动划分数据集了,我们根据上述的介绍,使用oob
来训练模型:
# 使用oobmodel = RandomForestClassifier(n_estimators=100, criterion='gini', random_state=1024, oob_score=True)model.fit(winedata.data, winedata.target)# # 查看各个基评估器# model.estimators_# # 看看精度0.9831# model.oob_score_
随机森林是基于决策树的,所以其参数选择有些多,有关
RandomForestClassifier
的详细参数说明可参考官方手册。
结束语
持续充电中,博客内容也在不断更新补充中,如有错误,欢迎来私戳小编哦!共同进步,感谢Thanks♪(・ω・)ノ
机器学习之随机森林(手推公式版)相关推荐
- 机器学习之决策树(手推公式版)
文章目录 前言 1. 分类树 2. 划分标准 2.1 信息增益 2.2 增益率 2.3 基尼系数 3. 剪枝策略 3.1 预剪枝 3.2 后剪枝 4. 模型实现 结束语 前言 决策树 ( D e ...
- 机器学习之求解无约束最优化问题方法(手推公式版)
文章目录 前言 1. 基础知识 1.1 方向导数 1.2 梯度 1.3 方向导数与梯度的关系 1.4 泰勒展开公式 1.5 Jacobian矩阵与Hessian矩阵 1.6 正定矩阵 2. 梯度下降法 ...
- 【干货】105页周志华教授《机器学习手推公式》开源PDF
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 上述内容是手推公式的主要内容,本项目的Github主页如下:https://git ...
- 机器学习算法-随机森林之理论概述
前面我们用 3 条推文从理论和代码角度讲述了决策树的概念和粗暴生成. 机器学习算法-随机森林之决策树R 代码从头暴力实现(3) 机器学习算法-随机森林之决策树R 代码从头暴力实现(2) 机器学习算法 ...
- 随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)
点击"机器学习研习社","置顶"公众号 重磅干货,第一时间送达 回复[大礼包]送你机器学习资料与笔记 回顾 推荐收藏>机器学习文章集合:1-20 机器学习 ...
- 干货 | 《深度学习》手推公式笔记开源PDF下载!
为大家找到的王博(Kings)的<深度学习>手推公式笔记,需要的伙伴可以在公众号"飞马会"菜单栏回复数字"91"查看获取方式. 深度学习手推笔记部分 ...
- 【火炉炼AI】机器学习007-用随机森林构建共享单车需求预测模型
[火炉炼AI]机器学习007-用随机森林构建共享单车需求预测模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matp ...
- 机器学习算法-随机森林初探(1)
机器学习算法-随机森林之理论概述 表达数据集来源于 https://file.biolab.si/biolab/supp/bi-cancer/projections/. 为了展示随机森林的能力,我们用 ...
- 机器学习算法-随机森林之决策树R 代码从头暴力实现(3)
前文 (机器学习算法 - 随机森林之决策树初探(1)) 讲述了决策树的基本概念.决策评价标准并手算了单个变量.单个分组的Gini impurity.是一个基本概念学习的过程,如果不了解,建议先读一下再 ...
最新文章
- 最新综述:激光雷达感知深度的域适应方法
- 浅谈python+requests实现接口自动化
- [YTU]_2442( C++习题 矩阵求和--重载运算符)
- 洛谷1279 字串距离
- libxml2用xpath进行查找
- Educational Codeforces Round 103 (Rated for Div. 2) D. Journey dp
- 《走遍中国》珍藏版(十三)
- Meta宣布将关闭面部识别系统 删除超10亿用户面部扫描数据
- 机器学习笔记-LightGBM
- C++ 从入门到入土(English Version) Section 2:Computer Memory and Number Systems
- STM32单片机基础(理论概念知识)
- PHP案例 许愿墙 PHP许愿墙
- mac的mysql关机后打不开了_mysql for mac服务无法启动
- python有什么特点有什么应用方向_你知道吗?python特点+可以做什么+就业前景(附30G学习资料)...
- WIN10企业版未激活如何解决
- 如何防止你的爬虫被网管一巴掌拍死
- CTFshow_命令执行
- ROS Wiki教程总结
- 实在智能“数字员工”发布,谈AI+RPA发展趋势,发布SaaS平台,并开源可供开发者下载打造小型机器人
- RHCE模拟练习题整理
热门文章
- ruoyi-cloud 服务器端idea启动报错Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (defau
- 13.0_[Java 面向接口]-类和接口
- ios和android耗电,安卓手机为什么比苹果手机更耗电?
- 吴秀波事件女主,被耽误的高阶玩家,一年12个月烧钱游遍全世界
- 【Multisim 14.0】软件安装教程
- python 可以用excel做词云图嘛_今天从零教你开始利用Python打造词云图!
- VASP出错 PZSTEIN parameter number 4 had an illegal value
- Installation of packages ‘stringi’ had non-zero exit status
- 【SPSS】交叉设计方差分析和协方差分析详细操作教程(附案例实战)
- 详解数字美元白皮书:可能和你想的不一样