决策树算法之随机森林
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了决策树算法之随机森林相关的知识,希望对你有一定的参考价值。
参考技术A在 CART 分类回归树 的基础之上,我们可以很容易的掌握随机森林算法,它们之间的区别在于,CART 决策树较容易过拟合,而随机森林可以在一定程度上解决该问题。
随机森林的主要思想是:使用随机性产生出一系列简单的决策树,并组合它们的预测结果为最终的结果,可谓三个臭皮匠赛过一个诸葛亮,下面我们就来具体了解一下。
产生随机森林的步骤大致为三步
在第 1 步,它是一个可放回抽样,即所产生的样本是允许重复的,这种抽样又被称为 Bootstrap,例如我们有以下 dummy 数据
在做完 Bootstrap 之后,可能的样本数据如下
可见,样本数据中,第 3 条和第 4 条样本是一样的,都对应的是原始数据中的第 4 条。
接下来,就是要使用上面的样本数据来产生决策树了,产生决策树的方法和 CART 基本一致,唯一的不同地方在于,节点的构建不是来自于全部的候选特征,而是先从中随机的选择 n 个特征,在这 n 个特征中找出一个作为最佳节点。
举个例子,假设 n = 2,且我们随机选择了「血液循环正常」和「血管堵塞」这两个特征来产生根节点,如下:
我们将在上述两个特征中选择一个合适的特征作为根节点,假设在计算完 Gini 不纯度之后,「血液循环正常」这个特征胜出,那么我们的根节点便是「血液循环正常」,如下图所示
接下来我们还需要构建根节点下面的节点,下一个节点将会在剩下的「胸口疼痛」、「血管堵塞」和「体重」三个特征中产生,但我们依然不会计算所有这 3 个特征的 Gini 不纯度,而是从中随机选择 2 个特征,取这 2 个特征中的 Gini 不纯度较低者作为节点。
例如我们随机选到了「胸口疼痛」和「体重」这两列,如下:
假设此时「体重」的 Gini 不纯度更低,那么第 2 个节点便是「体重」,如下图:
继续下去,我们便产生了一棵决策树。
随机森林是多棵决策树,在产生完一棵决策树后,接着会循环执行上述过程:Bootstrap 出训练样本,训练决策树,直到树的数量达到设置值——通常为几百棵树。
现在我们产生了几百棵树的随机森林,当我们要预测一条数据时,该怎么做呢?我们会聚合这些树的结果,选择预测结果最多的那个分类作为最终的预测结果。
例如我们现在有一条数据:
该条数据被所有树预测的结果如下:
上述结果聚合后为:
取最多的那项为最终的预测结果,即 Yes——该病人被诊断为患有心脏病。
以上,随机森林的两个过程: B ootstrap 和 Agg regate 又被称为 Bagging 。
本文我们一起学习了随机森林的算法,和 CART 决策树比起来,它主要被用来解决过拟合问题,其主要的思想为 Bagging,即随机性有助于增强模型的泛化(Variance) 能力。
参考:
相关文章:
机器学习算法 - 随机森林之决策树初探
随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。
随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个树给出一个分类结果,最终选择被最多的分类树支持的分类结果。回归则是不同树预测出的值的均值。
要理解随机森林,我们先学习下决策树。
决策树 - 把你做选择的过程呈现出来
决策树是一个很直观的跟我们日常做选择的思维方式很相近的一个算法。
如果有一个数据集如下:
data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7), color=c(rep('blue',5),rep('green',5)))
data
## x color
## 1 0.0 blue
## 2 0.5 blue
## 3 1.1 blue
## 4 1.8 blue
## 5 1.9 blue
## 6 2.0 green
## 7 2.5 green
## 8 3.0 green
## 9 3.6 green
## 10 3.7 green
那么假如加入一个新的点,其x
值为1
,那么该点对应的最可能的颜色是什么?
根据上面的数据找规律,如果x<2.0
则对应的点颜色为blue
,如果x>=2.0
则对应的点颜色为green
。这就构成了一个只有一个决策节点的简单决策树。
决策树常用来回答这样的问题:给定一个带标签的数据集(标签这里对应我们的color
列),怎么来对新加入的数据集进行分类?
如果数据集再复杂一些,如下,
data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7),
y=c(1,0.5,1.5,2.1,2.8,2,2.2,3,3.3,3.5),
color=c(rep('blue',3),rep('red',2),rep('green',5)))
data
## x y color
## 1 0.0 1.0 blue
## 2 0.5 0.5 blue
## 3 1.1 1.5 blue
## 4 1.8 2.1 red
## 5 1.9 2.8 red
## 6 2.0 2.0 green
## 7 2.5 2.2 green
## 8 3.0 3.0 green
## 9 3.6 3.3 green
## 10 3.7 3.5 green
如果
x>=2.0
则对应的点颜色为green
。如果
x<2.0
则对应的点颜色可能为blue
,也可能为red
。
这时就需要再加一个新的决策节点,利用变量y
的信息。
这就是决策树,也是我们日常推理问题的一般方式。
训练决策树 - 确定决策树的根节点
第一个任务是确定决策树的根节点:选择哪个变量和对应阈值选择多少能给数据做出最好的区分。
比如上面的例子,我们可以先处理变量x
,选择阈值为2
(为什么选2
,是不是有比2
更合适阈值,我们后续再说),则可获得如下分类:
我们也可以先处理变量y
,选择阈值为2
,则可获得如下分类:
那实际需要选择哪个呢?
实际我们是希望每个选择的变量和阈值能把不同的类分的越开越好;上面选择变量x
分组时,Green
完全分成一组;下面选择y
分组时,Blue
完全分成一组。怎么评价呢?
这时就需要一个评价指标,常用的指标有Gini inpurity
和Information gain
。
Gini Impurity
在数据集中随机选择一个数据点,并随机分配给它一个数据集中存在的标签,分配错误的概率即为Gini impurity
。
我们先看第一套数据集,10个数据点,5个blue
,5个green
。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?如下表,错误概率为0.25+0.25=0.5
(看下面的计算过程)。
probility <- data.frame(Event=c("Pick Blue, Classify Blue",
"Pick Blue, Classify Green",
"Pick Green, Classify Blue",
"Pick Green, Classify Green"),
Probability=c(5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10),
Type=c("Blue" == "Blue",
"Blue" == "Green",
"Green" == "Blue",
"Green" == "Green"))
probility
## Event Probability Type
## 1 Pick Blue, Classify Blue 0.25 TRUE
## 2 Pick Blue, Classify Green 0.25 FALSE
## 3 Pick Green, Classify Blue 0.25 FALSE
## 4 Pick Green, Classify Green 0.25 TRUE
我们再看第二套数据集,10个数据点,2个red
,3个blue
,5个green
。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?0.62
。
probility <- data.frame(Event=c("Pick Blue, Classify Blue",
"Pick Blue, Classify Green",
"Pick Blue, Classify Red",
"Pick Green, Classify Blue",
"Pick Green, Classify Green",
"Pick Green, Classify Red",
"Pick Red, Classify Blue",
"Pick Red, Classify Green",
"Pick Red, Classify Red"
),
Probability=c(3/10 * 3/10, 3/10 * 5/10, 3/10 * 2/10,
5/10 * 3/10, 5/10 * 5/10, 5/10 * 2/10,
2/10 * 3/10, 2/10 * 5/10, 2/10 * 2/10),
Type=c("Blue" == "Blue",
"Blue" == "Green",
"Blue" == "Red",
"Green" == "Blue",
"Green" == "Green",
"Green" == "Red",
"Red" == "Blue",
"Red" == "Green",
"Red" == "Red"
))
probility
## Event Probability Type
## 1 Pick Blue, Classify Blue 0.09 TRUE
## 2 Pick Blue, Classify Green 0.15 FALSE
## 3 Pick Blue, Classify Red 0.06 FALSE
## 4 Pick Green, Classify Blue 0.15 FALSE
## 5 Pick Green, Classify Green 0.25 TRUE
## 6 Pick Green, Classify Red 0.10 FALSE
## 7 Pick Red, Classify Blue 0.06 FALSE
## 8 Pick Red, Classify Green 0.10 FALSE
## 9 Pick Red, Classify Red 0.04 TRUE
Wrong_probability = sum(probility[!probility$Type,"Probability"])
Wrong_probability
## [1] 0.62
Gini Impurity计算公式:
假如我们的数据点共有C个类,p(i)是从中随机拿到一个类为i的数据,Gini Impurity
计算公式为:
$$ G = \sum_{i=1}^{C} p(i)*(1-p(i)) $$
对第一套数据集,10个数据点,5个blue
,5个green
。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?错误概率为0.25+0.25=0.5
。
对第二套数据集,10个数据点,2个red
,3个blue
,5个green
。
从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?0.62
。
决策树分类后的Gini Impurity
对第一套数据集来讲,按照x<2
分成两个分支,各个分支都只包含一个分类数据,各自的Gini IMpurity值为0。
这是一个完美的决策树,把Gini Impurity
为0.5
的数据集分类为2
个Gini Impurity
为0
的数据集。Gini Impurity
== 0是能获得的最好的分类结果。
第二套数据集,我们有两种确定根节点的方式,哪一个更优呢?
我们可以先处理变量x
,选择阈值为2
,则可获得如下分类:
每个分支的Gini Impurity
可以如下计算:
当前决策的Gini impurity
需要对各个分支包含的数据点的比例进行加权,即
我们也可以先处理变量y
,选择阈值为2
,则可获得如下分类:
每个分支的Gini Impurity
可以如下计算:
当前决策的Gini impurity
需要对各个分支包含的数据点的比例进行加权,即
两个数值比较0.24<0.29
,选择x
作为第一个分类节点是我们第二套数据第一步决策树的最佳选择。
前面手算单个变量
、单个分组
不算麻烦,也是个学习的过程。后续如果有更多变量和阈值时,再手算就不合适了。下一篇我们通过暴力方式自写函数训练决策树。
当前计算的结果,可以作为正对照,确定后续函数结果的准确性。()
参考:
https://victorzhou.com/blog/intro-to-random-forests/
https://victorzhou.com/blog/gini-impurity/
https://stats.stackexchange.com/questions/192310/is-random-forest-suitable-for-very-small-data-sets
https://towardsdatascience.com/understanding-random-forest-58381e0602d2
https://www.stat.berkeley.edu/~breiman/RandomForests/reg_philosophy.html
https://medium.com/@williamkoehrsen/random-forest-simple-explanation-377895a60d2d
往期精品(点击图片直达文字对应教程)
后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集
(请备注姓名-学校/企业-职务等)
以上是关于决策树算法之随机森林的主要内容,如果未能解决你的问题,请参考以下文章