python 随机森林 回归 python 随机森林调参_决策树


因为有Scikit-Learn这样的库,现在用Python实现任何机器学习算法都非常容易。随机森林是一个由众多决策树构建的集成学习算法模型。

随机森林模型的介绍,百度搜索,会出现一大堆,这里不再赘述。

这里有个“马氏真理”Hahaha~,作为我们常人或者算法使用者,亦或是对机器学习算法感兴趣的人,最终想要让模型的分类预测准确度符合我们的心理预期,那么从头到尾就在做一件事:调整模型参数、调整模型参数、调整模型参数!


这篇文章憋了好久(笔记本电脑不给力呀,调整参数,最长的一个参数调整花了5500秒!...)

终于是做完了整个流程

其实对于算法模型而言,调参是一个优化手段,还有就是数据预处理,也是非常重要!

下篇会分享数据预处理过程

言归正传,我们开始痛苦的调参旅程


实例:基于实际银行信贷数据建模,对潜在信贷违约客户进行筛选,降低银行遭受到损失的可能性。

数据:下载源很多,我从UCI上找了个信用卡违约数据集(30000条数据,23个属性维度,一个二分类标签列,即违约客户数据或正常客户数据)。


https://archive.ics.uci.edu/ml/datasets.phparchive.ics.uci.edu

目的:基于信用卡违约数据(带标签)构建一个随机森林模型,用于对新到数据进行分类预测(通过构建好的模型分析新数据,不带标签,最终给这个新数据一个预测标签,即这是一个正常客户数据还是具有潜在违约可能性的客户数据)。


第一步:参数及其作用

既然调参,我们来看看随机森林模型包含哪些参数

  • n_estimators:随机森林模型中包含决策树模型的个数
  • max_depth:决策树模型的最大深度
  • max_features:用于构建决策树时选取的最大特征数量
  • min_samples_leaf:叶子节点最少样本数
  • min_samples_split:当前节点允许分裂的最小样本数
  • criterion:节点分裂依据

第二步:导入数据,看看数据长啥样


import


python 随机森林 回归 python 随机森林调参_数据_02


只打印了前五行,可以看到一共24列(23维属性,最后1维标签)。

接下来,将属性和标签分别存在data和lable中


data



第三步:参数调整

你的电脑够好,闲时间够多,你可以直接利用网格搜索,一次性给上述六个参数寻找最优解。

介于我自身情况,我就挨个利用十折交叉验证寻求最优解......

所有用到的库(你这下明白Python的强大之处了吧)


from


先看看决策树与随机森林的对比(均是默认参数情况下)


Xtrain


Single Tree:0.7282222222222222 Random Forest:0.8084444444444444


rfc_l


python 随机森林 回归 python 随机森林调参_python 随机森林 回归_03


建立包含25棵决策树的RF模型与单棵决策树对比发现:起步就差了一大截,这就是单一模型与集成算法模型的本质区别

同时,我们以默认值的RF模型准确率0.8084为起步价,开始调参对比

(1)n_estimators


start


0.8175359393039934 151
Running time: 873.8298079967499 Seconds


python 随机森林 回归 python 随机森林调参_数据_04


RF模型中包含的决策树棵树,最优为151棵,为了再次确定,我们缩小范围


scorel


0.8178357948854587 151


python 随机森林 回归 python 随机森林调参_决策树_05


还是151棵决策树构建的RF最优

(2)max_depth


start


{'max_depth': 9}
0.8203333333333334
Running time: 990.1092164516449 Seconds

最优树深为9,准确率进一步提升。耗时将近1000秒= =|||(后面的调参时间更加恐怖)

(3)max_features


start


{'max_features': 13}
0.8166666666666667
Running time: 4579.233841180801 Seconds

你没看错......耗时4579秒!!!

这里要注意一下,我们选取max_features的个数从5至23进行迭代十折交叉验证,每次递增2,我有理由相信,max_features=13也许刚好跳过了最优点,很可能是12最优。

有人会问,为啥你就不能一次递增1进行迭代?

我滴个神呀,那我代码要跑到猴年马月去了......

(4)min_samples_leaf


start


{'min_samples_leaf': 31}
0.8208666666666666
Running time: 5526.928373336792 Seconds

......这运行时间说多了都是泪,同理上面的分析过程,不再赘述

(5)min_samples_split


start


{'min_samples_split': 16}
0.8195333333333333
Running time: 1723.3889367580414 Seconds

(6)criterion


start


{'criterion': 'gini'}
0.8175333333333333
Running time: 451.3224310874939 Seconds

以上,六个参数的最优解寻找完毕


最优参数整合,构建模型


import


0.8213027062336341

最优参数组合,最终模型的准确率达到了82.13%

和默认参数建模的准确率81.78%相比,略有提升

当然,还未从数据预处理的角度出发探究影响模型准确率的因素,例如异常值,数据平衡性等