因为有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
只打印了前五行,可以看到一共24列(23维属性,最后1维标签)。
接下来,将属性和标签分别存在data和lable中
data
第三步:参数调整
你的电脑够好,闲时间够多,你可以直接利用网格搜索,一次性给上述六个参数寻找最优解。
介于我自身情况,我就挨个利用十折交叉验证寻求最优解......
所有用到的库(你这下明白Python的强大之处了吧)
from
先看看决策树与随机森林的对比(均是默认参数情况下)
Xtrain
Single Tree:0.7282222222222222 Random Forest:0.8084444444444444
rfc_l
建立包含25棵决策树的RF模型与单棵决策树对比发现:起步就差了一大截,这就是单一模型与集成算法模型的本质区别
同时,我们以默认值的RF模型准确率0.8084为起步价,开始调参对比
(1)n_estimators
start
0.8175359393039934 151
Running time: 873.8298079967499 Seconds
RF模型中包含的决策树棵树,最优为151棵,为了再次确定,我们缩小范围
scorel
0.8178357948854587 151
还是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%相比,略有提升
当然,还未从数据预处理的角度出发探究影响模型准确率的因素,例如异常值,数据平衡性等