基于python的随机森林回归实现_基于Scikit-Learn机器学习库的随机森林模型优化调参流程...

7501742a0185c01260006efb4f4566f1.png

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

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

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


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

终于是做完了整个流程

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

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

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


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

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

https://archive.ics.uci.edu/ml/datasets.php​archive.ics.uci.edu

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


第一步:参数及其作用

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

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

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

import 

438b9cbbe3d07a02a3eaca28a2cebe4e.png

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

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

data 

第三步:参数调整

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

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

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

from 

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

Xtrain

Single Tree:0.7282222222222222 Random Forest:0.8084444444444444

rfc_l 

d0e272230262aa3eddf821f129e8f006.png

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

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

(1)n_estimators

start

0.8175359393039934 151
Running time: 873.8298079967499 Seconds

3adadb5a6276eb860982aa736d30d5f2.png

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

scorel 

0.8178357948854587 151

e3f5770a16b4d236219305b7d3349684.png

还是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%相比,略有提升

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


结束语

本文只是把这两天所学的应用了一下,还有所欠缺,但是首先给大家提供了一种调参实操方法,不要无脑上网格搜索算法,跑死机子跑死你 = =|||


END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值