决策树算法之随机森林

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的信息。

机器学习算法 - 随机森林之决策树初探(1)

这就是决策树,也是我们日常推理问题的一般方式。

训练决策树 - 确定决策树的根节点

第一个任务是确定决策树的根节点:选择哪个变量和对应阈值选择多少能给数据做出最好的区分。

比如上面的例子,我们可以先处理变量x,选择阈值为2 (为什么选2,是不是有比2更合适阈值,我们后续再说),则可获得如下分类:

机器学习算法 - 随机森林之决策树初探(1)

我们也可以先处理变量y,选择阈值为2,则可获得如下分类:

机器学习算法 - 随机森林之决策树初探(1)

那实际需要选择哪个呢?

实际我们是希望每个选择的变量和阈值能把不同的类分的越开越好;上面选择变量x分组时,Green完全分成一组;下面选择y分组时,Blue完全分成一组。怎么评价呢?

这时就需要一个评价指标,常用的指标有Gini inpurityInformation 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)) $$ 

机器学习算法 - 随机森林之决策树初探(1)

对第一套数据集,10个数据点,5个blue,5个green。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?错误概率为0.25+0.25=0.5

机器学习算法 - 随机森林之决策树初探(1)

对第二套数据集,10个数据点,2个red,3个blue,5个green

从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?0.62

机器学习算法 - 随机森林之决策树初探(1)

决策树分类后的Gini Impurity

对第一套数据集来讲,按照x<2分成两个分支,各个分支都只包含一个分类数据,各自的Gini IMpurity值为0。

这是一个完美的决策树,把Gini Impurity0.5的数据集分类为2Gini Impurity0的数据集。Gini Impurity== 0是能获得的最好的分类结果。

机器学习算法 - 随机森林之决策树初探(1)

机器学习算法 - 随机森林之决策树初探(1)

第二套数据集,我们有两种确定根节点的方式,哪一个更优呢?

我们可以先处理变量x,选择阈值为2,则可获得如下分类:

机器学习算法 - 随机森林之决策树初探(1)

每个分支的Gini Impurity可以如下计算:

机器学习算法 - 随机森林之决策树初探(1)

当前决策的Gini impurity需要对各个分支包含的数据点的比例进行加权,即

机器学习算法 - 随机森林之决策树初探(1)

我们也可以先处理变量y,选择阈值为2,则可获得如下分类:

机器学习算法 - 随机森林之决策树初探(1)

每个分支的Gini Impurity可以如下计算:

机器学习算法 - 随机森林之决策树初探(1)

当前决策的Gini impurity需要对各个分支包含的数据点的比例进行加权,即

机器学习算法 - 随机森林之决策树初探(1)

两个数值比较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


往期精品(点击图片直达文字对应教程)


后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

机器学习算法 - 随机森林之决策树初探(1)

机器学习算法 - 随机森林之决策树初探(1)

 

(请备注姓名-学校/企业-职务等)

以上是关于决策树算法之随机森林的主要内容,如果未能解决你的问题,请参考以下文章

web安全之机器学习入门——3.2 决策树与随机森林算法

机器学习中的算法——决策树模型组合之随机森林与GBDT

决策树模型组合之(在线)随机森林与GBDT

机器学习中的算法-决策树模型组合之随机森林与GBDT

机器学习中的算法-决策树模型组合之随机森林与GBDT

课时决策树和随机森林