您现在的位置是:首页 > 正文

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

2024-04-01 05:15:10阅读 1

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

网站文章

  • Vue3+Ts+Vite项目(第十三篇)——配置Element-Plus主题色

    Vue3+Ts+Vite项目(第十三篇)——配置Element-Plus主题色

    找了很多博客,总结出来的最有效的vue3+ts+vite项目配置element-plus组件主题色

    2024-04-01 05:15:02
  • java 数组 push pop_JavaScript学习笔记:数组的push()、pop()、shift()和unshift()方法

    java 数组 push pop_JavaScript学习笔记:数组的push()、pop()、shift()和unshift()方法

    JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型。在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操作数组(比如删除当前项,则所有之后的...

    2024-04-01 05:14:56
  • 51Talk-Level 7 Unit 5 L2

    今日主题:保守秘密(keeping a secret )高频口语句型(想到中文但是不能马上联想到英文的):1. break up with somebody 与某人绝交2. lie to somebody 向某人说谎3. be tempted to do something 想做某事4. look up to 羡慕,尊敬5

    2024-04-01 05:14:50
  • leetcode:149. 直线上最多的点数

    题目: 给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o ±------------> 0 1 2 3 4 示例 2: 输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] 输出: 4 解释: ^ ...

    2024-04-01 05:14:11
  • 高性能(二)

    高性能(二)

    高性能(二)

    2024-04-01 05:14:04
  • 【Linux】项目shell启动脚本简单模本

    背景:启动 tomcat + jar工程

    2024-04-01 05:13:57
  • Pytorch中的转置卷积

    反卷积反卷积(Transposed Convolution)输出大小计算起点可以整除不可以整除综合起来参考文献 反卷积(Transposed Convolution) 又称为转置卷积。 torch.n...

    2024-04-01 05:13:17
  • 安装think PHP5

    安装think PHP5

    Composer安装 Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。 下载地址:https://getcomposer.org/Com...

    2024-04-01 05:13:10
  • java:CAS、ABA问题详解

    1、java中的原子性操作所谓原子性操作,是指执行一系列操作时,这些操作要么全部执行,要么全部不执行,不存在只执行其中一部分的情况。2、CAS方法CAS即Compare and Swap,其是JDK提...

    2024-04-01 05:13:02
  • 系统错误:&H8007007E(-2147024770)。 找不到指定的模块。解决

    系统错误:&H8007007E(-2147024770)。 找不到指定的模块。 就很发呆,以前就正常。 然后发现多个ocx,那肯定是这个组件没有注册了。运行了vb库失败后,便从程序里复制了MSINET.OCX,放到了c:/windows/systems32 下面 然后在开始运行里输入:regsvr32 MSINET.OCX,进行注册 提示注册成功后,完成 程序...

    2024-04-01 05:12:20