一、概述
随机森林(random forest)是将多个模型综合起来创建更高性能模型的方法,既可用于回归,也可用于分类。同样的算法有梯度提升(gradient boosting)等在机器学习竞赛中很受欢迎的算法。通过学习随机森林,我们可以学到在其他算法中也适用的基础知识。
随机森林的目标是利用多个决策树模型,获得比单个决策树更高的预测精度。单个决策树的性能并不一定很高,但是多个决策树汇总起来,一定能创建出泛化能力更强的模型。随机森林既可用于回归,也可用于分类,这里以分类问题为例进行说明。如图是随机森林分类算法的示意图。该算法从每个决策树收集输出,通过多数表决得到最终的分类结果。
随机森林的多数表决就像找别人商量事情一样,不只听一个人的意见,而是在听取许多人的意见之后综合判断。机器学习也一样,通过创建多个模型,采取多数表决的方式,可以期待获得更为妥当的结果。需要注意的是,如果使用同样的学习方法创建决策树,那么输出的就都是同样的东西,也就失去了采取多数表决的意义。在随机森林中,采用的决策树要具备多样性,这一点很重要。
二、算法说明
随机森林是综合决策树的结果的算法。
1. 决策树
决策树是通过将训练数据按条件分支进行划分来解决分类问题的方法,在分割时利用了表示数据杂乱程度(或者不均衡程度)的不纯度的数值。决策树为了使表示数据杂乱程度的不纯度变小,对数据进行分割。当分割出来的组中存在很多相同的标签时,不纯度会变小;反之,当分割出来的组中存在很多不同的标签时,不纯度会变大。
表示不纯度的具体指标有很多种,本文利用基尼系数。基尼系数的计算式如下:
c 是标签数,pi是某个标签的数据数量占数据总数的比例。
如图所示为使用几种不同的分割方法计算得出的加权平均基尼系数。左侧是分割前的状态,这时的基尼系数为0.5。中间是分割后求出的基尼系数的平均值。使用分割出的每个部分的基尼系数乘以该部分所含数据的数量所占的比例,得到加权平均值。右侧是使基尼系数的平均值最小的分割方法的例子。
决策树的学习是通过反复分割像上图那样的空间来进行的。具体来说,就是重复以下流程。
1. 计算某个区域的所有特征值和候选分割的不纯度。
2. 以分割时不纯度减小最多的分割方式分割区域。
3. 对于分割后的区域,重复步骤1和步骤2。
决策树学习的过程如图所示:
2. 随机森林
随机森林是如何使用多棵决策树来提高精度的呢?假设有3棵独立的决策树,每棵的正确率为0.6。此时,对每棵决策树的结果进行多数表决,并将表决结果作为预测结果,即可提高正确率。在这种
情况下,预测不正确有两种情况:一种是所有的决策树都预测不正确,概率是 0.064,另一种是3棵决策树中有2棵预测不正确,概率是0.288,所以正确的概率是0.648(1-0.064-0.288)。可以看出,正确率的确变高了。
接下来,让我们思考如何使用相同的数据训练多棵独立的决策树。这其实并不简单。机器学习从相同的数据上学习的结果基本上是一样的,即使有100棵决策树,如果它们的学习方法都一样,那么多数表决的结果也还是一样的。
随机森林尝试对每棵决策树的数据应用下述方法来进行训练,以使分类结果尽可能地不同。首先采用Bootstrap方法,根据训练数据生成多个不同内容的训练数据。所谓Bootstrap方法,即通过对单个训练数据进行多次随机的抽样放回,“虚增”训练数据,这样就可以为每棵决策树输入不同的训练数据。然后根据使用Bootstrap方法创建的训练数据训练决策树时,只随机选取部分特征值来训练决策树。通过“Bootstrap方法”和“随机选取特征值”两种方法,就可以训练出具有多样性的决策树。
随机森林利用这种方式创建多棵数据集、训练多棵决策树、对预测结果进行多数表决,返回最终的分类结果。
三、示例代码
用随机森林基于3种葡萄酒的各种测量值数据,对葡萄酒进行分类
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 读取数据
data = load_wine()
X_train, X_test, y_train, y_test = train_test_split(data.data,
data.target, test_size=0.3)
model = RandomForestClassifier()
model.fit(X_train, y_train) # 训练
y_pred = model.predict(X_test)
print(accuracy_score(y_pred, y_test)) # 评估
四、详细说明
特征的重要度
随机森林可以让我们知道每个特征对预测结果的重要度。下面我们先了解一下特征重要度的计算方法,然后以葡萄酒分类为例,看一下各特征的重要度。首先介绍一下使用随机森林计算重要度的方法。前面讲过,每棵决策树的学习方法都是通过沿着某个值分割特征,使不纯度尽可能地小。通过对随机森林的所有决策树求在以某个特征分割时的不纯度并取平均值,可以得到特征的重要度。将重要度高的特征用于分割,有望大幅度减小不纯度。反之,重要度低的特征即使被用于分割,也无法减小不纯度,所以可以说这样的特征是非必要的。基于特征的重要度,我们可以去除非必要的特征。
接下来,我们以葡萄酒分类为例,看一下特征的重要度。如图所示为使用随机森林算出的特征重要度。 图中重要度高的特征color_intensity表示色泽,这说明它对葡萄酒的分类非常重要,这个结论直观,让人信服。