一、前言
回归随机森林作为一种机器学习和数据分析领域常用且有效的算法,对其原理和代码实现过程的掌握是非常有必要的。为此,本文将着重介绍从零开始实现回归随机森林的过程,对于随机森林和决策树的相关理论原理将不做太深入的描述。本文的目的只是为了演示回归随机森林主要功能的具体实现过程,在实现过程中不会考虑代码性能,会更加注重代码可读性。
实现语言:Python
依赖:pandas, numpy
二、原理介绍
随机森林属于Bagging类算法,而Bagging 又属于集成学习一种方法(集成学习方法大致分为Boosting和Bagging方法,两个方法的不同请参考[10]),集成学习的大致思路是训练多个弱模型打包起来组成一个强模型,强模型的性能要比单个弱模型好很多(三个臭皮匠顶一个诸葛亮。注意:这里的弱和强是相对的),其中的弱模型可以是决策树、SVM等模型,在随机森林中,弱模型选用决策树。
在训练阶段,随机森林使用bootstrap采样从输入训练数据集中采集多个不同的子训练数据集来依次训练多个不同决策树;在预测阶段,随机森林将内部多个决策树的预测结果取平均得到最终的结果。本文主要介绍回归随机森林从零实现的过程,实现的RFR(回归随机森林)具有以下功能:模型训练
模型数据预测
计算feature importance
2.1 模型训练
2.1.1 基础理论
本文实现的RFR是将多个二叉决策树(即CART,这也是sklearn,spark内部实现的模型)打包组合而成的,训练RFR便是训练多个二叉决策树。在训练二叉决策树模型的时候需要考虑怎样选择切分变量(特征)、切分点以及怎样衡量一个切分变量、切分点的好坏。针对于切分变量和切分点的选择,本实现采用穷举法,即遍历每个特征和每个特征的所有取值,最后从中找出最好的切分变量和切分点;针对于切分变量和切分点的好坏,一般以切分后节点的不纯度来衡量,即各个子节点不纯度的加权和
,其计算公式如下:
(2-1)
其中,
为某一个切分变量,
为切分变量的一个切分值,
分别为切分后左子节点的训练样本个数、右子节点的训练样本个数以及当前节点所有训练样本个数,
分为左右子节点的训练样本集合,
为衡量节点不纯度的函数(impurity function/criterion),分类和回归任务一般采用不同的不纯度函数,在分类和回归常采用的不纯度函数有以下四种:
图 1. 四种不同的impurity function备注1:
Gini不纯度只适用于分类任务,
为当前节点的训练样本集合,
为当前节点训练样本中目标变量取值k(
)出现的概率。备注2:
信息熵只适用于分类任务, 其他同备注1。备注3
MSE只适用于回归任务,
为当前节点样本目标变量的平均值。备注4
MAE只适用于回归任务,
为当前节点样本目标变量的平均值。备注5
在sklearn内部,DecisionTreeClassifier, RandomForestClassifier等基于决策树的分类模型默认使用'gini'作为impurity function,也可通过criterion参数指定为'entropy';而DecisionTreeRegressor, RandomForestRegressor等基于决策树的回归模型默认使用'mse'作为impurity function,也可通过criterion参数指定为'mae'。
决策树中某一节点的训练过程在数学等价于下面优化问题:
(2-2)
即寻找
最小的切分变量和切分点。
在本文实现的回归随机森林中,
选用MSE,即针对某一切分点
(2-3)
2.1.2 训练过程
RFR训练过程示意图如图2所示。图 2. RFR训练示意图
说明:bootstrap[1]是对输入训练样本集合
进行N次放回重复抽样得到样本集合
(N一般等于
的大小[2],具体可以查看sklearn的实现代码),这暗示了
中的某些样本会在
中重复出现多次。在对
进行bootstrap采样时,
中每个样本会以63.3%的概率被抽中。为什么是63.3%?考虑N次放回重复抽样,每次抽样每个样本被选中的概率为