随机森林回归预测python,随机森林 Python
一.导言
作为机器学习和数据分析领域中一种常用且有效的算法,掌握其原理和代码实现过程是非常必要的。因此,本文将重点讨论从无到有回归随机森林的过程,不会对随机森林和决策树的相关理论原理做太深入的描述。本文的目的只是演示回归随机森林主要功能的具体实现过程。在实现过程中,不会考虑代码性能,但会更加注重代码可读性。
实现语言:Python
依赖:熊猫,numpy
二。原理介绍随机森林属于Bagging算法,Bagging属于集成学习的一种方法(集成学习方法大致分为Boosting和Bagging方法,两种方法的区别请参考[10])。集成学习的总体思路是训练几个弱模型打包起来形成一个强模型,强模型的性能比单个弱模型好很多(三个臭皮匠顶个诸葛亮)。注:这里弱和强是相对的),其中弱模型可以是决策树、SVM等模型。在随机森林中,弱模型是决策树。
在训练阶段,随机森林使用bootstrap采样从输入训练数据集中收集多个不同的子训练数据集,依次训练多个不同的决策树;在预测阶段,随机森林对内部几棵决策树的预测结果进行平均,得到最终结果。本文主要介绍从零开始实现回归随机森林的过程。实现的RFR(回归随机森林)具有以下功能:
模型训练模型数据预测计算功能重要性2.1模型训练
基本理论
本文实现的RFR是多个二元决策树的组合(也就是CART,也是SKLearn和Spark的内部模型),训练RFR就是训练多个二元决策树。在训练二叉决策树模型时,我们需要考虑如何选择分割变量(特征)和分割点,以及如何衡量分割变量和分割点的质量。针对分割变量和分割点的选取,本实现采用了穷举法,即遍历每个特征和每个特征的所有值,最终找出最佳分割变量和分割点;至于分割变量和分割点的质量,一般用被分割节点的杂质来衡量,即每个子节点的杂质的加权和。
,其计算公式如下:(2-1)
其中,
它是一个分割变量,分割变量的截断值,分割变量是左子节点的训练样本数、右子节点的训练样本数和当前节点的所有训练样本数。它被分成左右子节点的训练样本集。分类和回归任务作为衡量节点杂质的函数(杂质函数/准则),一般采用不同的不纯函数。分类和回归中常用的不纯函数有四种:图1。四种不同的不纯函数
基尼系数仅适用于分类任务,
是当前节点的训练样本集,取目标变量K()在当前节点的训练样本中出现的概率。注2:信息熵只适用于分类任务,其他同注1。
注3 MSE仅适用于回归任务,
是当前节点样本的目标变量的平均值。注4 MAE仅适用于回归任务,
是当前节点样本的目标变量的平均值。5注意在sklearn内部,DecisionTreeClassifier、RandomForestClassifier等基于决策树的分类模型默认使用‘Gini’作为impractivity函数,也可以通过criterion参数指定为‘熵’;基于决策树的回归模型,如决策树回归、随机森林回归等。默认使用‘MSE’作为减值函数,也可以通过criterion参数指定为‘Mae’。
决策树中节点的训练过程在数学上等价于以下优化问题:
(2-2)
那就是,寻找
最小分割变量和分割点。在本文实现的回归随机森林中,
选择MSE,即对于某个春分点。
(2-3)培训流程
RFR训练流程示意图如图所示
Bootstrap[1]是对输入的训练样本集重复采样n次得到的样本集(n一般等于[2]的大小,具体可以看sklearn的实现代码),暗示了in中的一些样本会在中重复出现。在bootstrap抽样时,将以63.3%的概率选择中的每个样本。为什么是63.3%?考虑重复抽样n次,每次抽样每个样本被选中的概率为:(2-4)抽样n次时。
详情请参考[3-4]。
根据输入参数sample_sz的大小,subsample会从中间抽取sample_sz样本组成子样本样本集(在sklearn中,子样本大小是输入训练样本集的大小n,不能通过输入参数指定子样本的大小。详情见此)。为什么自举?集成学习(包括随机森林)的目的是使用多个不同的子模型来增加最终模型预测结果的鲁棒性和稳定性(即减少方差)。如果用同一个数据集训练多个子模型,那么训练出来的子模型都是一样的,集成学习就会变得没有意义。为了从原始输入训练数据集中得到多个不同的数据集,需要bootstrap从原始数据集中采样不同的子数据集来训练子模型。图2中n个回归决策树的训练过程如图3所示。
图3。回归决策树训练过程
2.2模型预测
R的预测结果是通过平均所有内部二叉决策树的预测结果得到的。二元决策树的预测过程主要分为以下几个步骤:
对于输入样本,从二叉决策树的根节点判断当前节点是否为叶节点,如果是,则返回叶节点的预测值(即当前叶中样本目标变量的平均值),如果不是,则进入下一步;根据当前节点的分段变量的和正切值,将样本中对应变量的值与该节点的正切值进行比较。如果采样变量值小于或等于当前节点的正切值,则访问当前节点的左子节点;如果样本变量值大于当前节点的正切值,则访问当前节点的右子节点;循环步骤2,直到访问叶节点,并返回叶节点的预测值。2.3计算特征重要性
某个特征的重要性表明了它对预测结果的影响程度。特征的重要性越大,对预测结果的影响越大,重要性越小。一个特征在R中的重要性是它在所有决策树中重要性的平均值。在决策树中,可以使用以下三种方法来计算功能的重要性:
方法1
步骤如下:
通过使用训练数据来训练模型;根据模型上一个度量的得分计算训练数据,记为(R2);可用于回归);遍历训练数据集中的每个特征,每次在原始训练数据集的基础上对相应的特征进行洗牌,然后利用模型得到洗牌后数据集的得分,记为,最后计算第一个特征的重要性。方法2
如果某个特征很重要,从数据集中去除该特征后,模型的预测误差会增大;相反,如果某个特征不重要,那么从数据集中剔除后,模型的预测误差不会有太大变化。该方法包括以下步骤:
用原始数据集对模型进行训练,在训练数据集上评估模型的预测误差,记为;遍历训练数据集中的每个特征,每次从原始训练数据集中去掉该特征,然后用得到的数据集训练模型,最后计算预测误差,最后计算第一个特征的重要性。这种方法有点类似于方法1,但是这种方法在计算每个特征的重要性时需要重新训练模型,这样会增加计算量。实际应用中一般不采用这种方法。
方法3
当sklearn内部树模型计算特征的重要性时使用该方法。也就是某个节点。
的重要性是(2-5)
其中,
它是一个节点及其左右子节点中训练样本数分别占总训练样本数的比值,可分为该节点及其左右子节点的杂质。知道了每个节点的重要度后,通过公式(2-6)就可以得到某个特征的重要度。(2-6)
为了使所有特征的总重要性等于1,需要对每个特征的重要性进行归一化,即公式(2-7)。
(2-7)
sklearn中方法3的实现见_tree.pyx。
在本文实现的RFR中,方法1和3是同时实现的。
3.回归随机森林实现3.1代码。
代码有点长,不想看可以跳过。
来自3.2测试
训练和预测:
在sklearn内部使用RandomForestRegressor的结果:
需要注意的是,以上两个培训的样本不同,所以与实际情况有些出入,但大趋势是正确的。
功能重要性:
RFRegressor使用方法3计算的特征的重要性:
RandomForestRegressor计算的功能重要性:
RFRegressor使用方法1计算的要素重要性:
参考和推荐:
[1]引导示例:定义,示例
[2]随机森林中每棵树的样本数
[3]为什么平均来说每个bootstrap样本包含大约三分之二的观察值?
[4]随机森林外袋样本量
[5]兰登森林
[6]为什么单树随机森林比决策树分类器好很多?
[7]赢得偏差-方差权衡
[8]子采样-自举
[9]sci kit-Learn随机森林子样本大小如何可能等于原始训练数据大小?
[10]装袋和助推的区别
[11]sci kit-learn和Spark中的决策树、随机森林和特征重要性的数学
[12] Sklearn决策树文档
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。