机器学习中的早停策略

2023-05-16

前言

在做机器学习模型调优的时候,往往会通过一系列的操作去提升调优效率,其中有一种技术就是合理运用早停策略。

关于数据集:本文直接使用kaggle的数据集,你可以直接点击链接下载。

一、入门

1.验证集性能和迭代次数的关系

我们这里选用lightgbm算法作为演示,随机选择了一些参数值,然后设置n_estimators=1000,接下来我们来看一下验证集的性能和n_estimators的关系。

data = pd.read_csv('..\resource\data.csv',index_col=0)
Y = data.pop('target')
X = data
x_train,x_eval,y_train,y_eval = train_test_split(X,Y, test_size=0.2, random_state=623)

#模型训练
clf = lgb.LGBMClassifier(max_depth=4,n_estimators=1000,learning_rate=0.07)
clf.fit(x_train,y_train,eval_set=[(x_eval,y_eval)])

#获取验证集的结果
evals_results = clf.evals_result_['valid_0']['multi_logloss']

#画图
plt.plot(evals_results)
plt.vlines(100, 1.09, evals_results[100],color="red")
plt.vlines(np.argmin(evals_results), 1.09, evals_results[np.argmin(evals_results)],color="red")
plt.vlines(800, 1.09, evals_results[800],color="red")
plt.title('eval_metric_curve')
plt.xlabel('n_estimators')
plt.ylabel('multi_logloss')
plt.ylim(1.09,1.13)
plt.show()

在这里插入图片描述
从上面的结果图上我们可以看到,在实际训练的过程当中,如果只训练到第一根红线的位置,明显模型欠拟合,如果一直训练下去,训练到第三根红线的时候,明显模型过拟合了,最好的位置是第二根红线所在的位置,这时候,模型在验证集上的性能最优。

2. 引入早停策略

如上面分析,如果训练时间过短,模型还没有收敛,如果训练时间过长,模型开始过拟合,这个时候我们可以在fit阶段加入early_stopping_rounds参数,整体代码修改如下:

#省略相同代码
clf = lgb.LGBMClassifier(max_depth=4,n_estimators=1000,learning_rate=0.07)
clf.fit(x_train,y_train,eval_set=[(x_eval,y_eval)],early_stopping_rounds=50)
evals_results = clf.evals_result_['valid_0']['multi_logloss']
plt.plot(evals_results)
plt.title('eval_metric_curve')
plt.xlabel('n_estimators')
plt.ylabel('multi_logloss')
plt.show()
print('best training score:',min(evals_results))

scorer=get_scorer('neg_log_loss')
score = scorer(clf,x_eval,y_eval)
print('finnal model score:',score*scorer._sign)

在这里插入图片描述
同时使用了早停策略之后,模型会直接使用过程中最优的模型,如下图所示:
在这里插入图片描述

对比如果不使用早停策略的话,使用的是最终的一个过拟合模型,如下图所示:
在这里插入图片描述

二、进阶

以上介绍的是单个模型在训练的时候,我们一般可以使用较大的n_estimators+early_stopping_rounds进行模型的训练,但是在实际项目当中,还会涉及到模型如何调优的问题,这里我们以常见的GridSearchCV来演示一下。

这里我们基于上面的内容,继续来探索最优的几个其他参数,代码如下:


from sklearn.model_selection import GridSearchCV
#这里省略掉相同部分的代码
# ...
lightgbm_param_grid = {"max_depth":[3,4,5],
                       "num_leaves" : [20,31,50],
                       "reg_alpha":[0.1,0.5,1],
                       "reg_lambda":[0.001,0.005,0.01]
                       }
clf = lgb.LGBMClassifier(n_estimators=300,learning_rate=0.07)
Gclf = GridSearchCV(clf,param_grid = lightgbm_param_grid, cv=5, scoring="neg_log_loss",n_jobs= 4,verbose = 1)
Gclf.fit(x_train,y_train)
print(Gclf.best_params_)

通过上面的代码,我们可以进一步去获取最优的lightgbm参数,但是需要考虑到这里训练总次数一共是
参数组合(81) * 交叉验证(5) = 405次的训练次数。那这里又会出现一些新的需求

1. 在指定时间内搜索

老板刚刚给我打电话,说你现在手上的模型明天就得正式提测,那对于我来说,我就只有一个晚上的时间可以进行最后的调参了,所以我不得不考虑到我总共只有10h小时的时间了,那么上面的代码需要进行如下修改(伪代码)。

with Timer as Searching:
	这里还是做原来的参数调优
	if Searching.duration > 10*60*60:
		搜索超过10h,结束整个任务,然后保存最优的模型参数

这样一来,第二天早上九点我可以直接得到最优参数,然后进行提测(不然可能你会发现第二天你来了,程序还在运行,停止的话,什么都没有了,不停止的话,测试部已经开始在催你了)

2. 模型达到某一性能即可

两周前我们的模型的最优性能是98.6%的准确度,这个时候客户很满意我们的性能,然后告诉我们后天正式下单,这个时候,我的老板走过来告诉我,这可是一个大客户,你现在还有一点时间,你在调优调优,争取让性能突破98.6%的水平,给客户留下一个好印象,那这个时候我就想着在尝试尝试呗,看一下性能能不能继续突破98.8%,那整体代码设计修改如下:

In search step:
 if 当前模型的性能超过98.8%:
 	停止整个程序,保存最优模型性能

3. 连续N次性能都没有提升

机器学习的性能瓶颈往往不在于模型参数,而在于你提供的数据特征是什么水平(而想要做出非常优秀的特征,往往又需要对实际业务非常了解),所以尽管在时间充裕的情况下,一直进行参数调优的意义其实不会太大。所以可能会出现你用2h和用8h进行参数搜索的最终结果是一样的情况,那这个时候我们可以修改我们的整体代码如下:

In search step:
 if 当前模型性能 < 历史模型最优性能:
 	统计当前已经多少轮性能没有进一步提升了
 	if 轮数 > 阈值:
 		停止整个程序,保存最优模型

备注:连续N次性能都没有提升一般不适用于网格搜索,因为网格搜索搜索效率不会随着搜索次数的增多而提升,而对于常见的贝叶斯优化,遗传搜索算法,随着先验知识的累计,搜索效率是会提升的。

附:建模技巧

还是以上面的数据集为例,我们上面入门篇的时候,得到的模型最优性能是1.10013,现在我们尝试使用hypergbm[https://github.com/DataCanvasIO/HyperGBM],来进一步提升模型的性能。

在hypergbm中,支持的早停策略如下:
在这里插入图片描述

##首先是安装hypergbm
#pip install hypergbm

from sklearn.model_selection import train_test_split
from hypergbm import make_experiment
from sklearn.metrics import get_scorer


##导入数据
data = pd.read_csv('..\resource\data.csv',index_col=0)
df_trian,df_test = train_test_split(data, test_size=0.2, random_state=623)
target = 'target'

## 限制整个搜索时间为10h
exp1 = make_experiment(df_train,
					 target=target,
					 log_level='info',
					 max_trilas=10000, #使用早停策略,总搜索次数可以设置得足够大,默认为10
					 early_stopping_time_limit=10*3600)


## 当模型性能突破1.1就停止
exp2 = make_experiment(df_train,
					 target=target,
					 log_level='info',
					 max_trilas=10000, #使用早停策略,总搜索次数可以设置得足够大,默认为10
					 early_stopping_reward=1.1)


## 当搜索连续50次性能都没有提升
exp3 = make_experiment(df_train,
					 target=target,
					 log_level='info',
					 max_trilas=10000, #使用早停策略,总搜索次数可以设置得足够大,默认为10
					 early_stopping_rounds=50)
estiamtor = exp2.run()



##模型评估
scorer=get_scorer('neg_log_loss')
score = scorer(estimator,df_test,df_test[target])
score 

附2:

同样的你在使用hypergbm进行建模的时候,可以设置n_estimators较大,然后使用单模型的早停策略即可。代码如下:

from hypergbm.search_space import GeneralSearchSpaceGenerator
search_space_ = GeneralSearchSpaceGenerator(n_estimators= 900##默认值为200
exp4 = make_experiment(df_train,
					 target=target,
					 log_level='info',
					 max_trilas=100, 
					 search_space=search_space_,
					 estimator_early_stopping_rounds = 100#默认值为n_estimators//20
					 )
estiamtor = exp4.run()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习中的早停策略 的相关文章

  • Win7 + Ubuntu16.04 双系统安装

    之前安装win7 43 Ubuntu14 04双系统 xff0c 后来换成win10用了一段时间后觉得有些卡 xff0c 而且装双系统装了几次都成功 xff0c 所以又换回了win7系统 xff0c 并重新安装了win7 43 Ubuntu
  • 双系统Ubuntu 引导修复(Boot Repair)

    安装完双系统 xff0c 如果在使用过程中不小心删除了Ubuntu引导向 xff0c 则会导致开机后无法选择进入Ubuntu系统 或者当我们重装了windows系统后 xff0c 也会发现原来的Ubuntu引导不见了 xff0c 当出现这两
  • 数据库为何要有复合主键(多主键)

    最近学习一点数据库的基本知识 xff0c 被一个问题困惑了许久 xff1a 主键是唯一的索引 xff0c 那么为何一个表可以创建多个主键呢 xff1f 其实 主键是唯一的索引 这话有点歧义的 举个例子 xff0c 我们在表中创建了一个ID字
  • @JSONField 注解详解和应用

    讲到 64 JSONField 注解 xff0c 就不得不提到Alibaba 开源的fasejson fastjson是目前java语言中最快的json库 xff0c 比自称最快的jackson速度要快 xff0c 第三方独立测试结果看这里
  • 外部访问docker容器(docker run -p/-P 指令)

    容器中可以运行一些网络应用 xff0c 要让外部也可以访问这些应用 xff0c 可以通过 P xff08 大写 xff09 或 p xff08 小写 xff09 参数来指定端口映射 xff08 1 xff09 当使用 P 标记时 xff0c
  • 解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

    LocalDate LocalTime LocalDateTime 是Java 8开始提供的时间日期API xff0c 主要用来优化Java 8以前对于时间日期的处理操作 然而 xff0c 我们在使用Spring Boot或使用Spring
  • gcc 编译选项

    原来 Os相当于 O2 5 是使用了所有 O2的优化选项 xff0c 但又不缩减代码尺寸的方法 ffunction sections fdata sections Place each function or data item into
  • RYU功能开发(一)从simple switch开始

    对于任意一款控制器 xff0c 想要快速了解其开发机制 xff0c 从转发模块入手无疑是最佳的学习方式 RYU通过App的形式提供了一系列功能模块 xff0c 其中包括使用了OpenFlow作为控制协议的二层交换机控制模块simple sw
  • arm-linux-gcc交叉工具链

    Linux ARM交叉编译工具链制作过程 一 下载源文件 源代码文件及其版本与下载地址 xff1a Binutils 2 19 tar bz2 Index of gnu binutils gcc 4 4 4 tar bz2 Index of
  • 我使用过的Linux命令之cal - 显示日历

    我使用过的Linux命令之cal 显示日历 本文链接 xff1a http codingstandards iteye com blog 807962 xff08 转载请注明出处 xff09 用途说明 cal命令可以用来显示公历 xff08
  • 驼峰式与下划线命名规则

    在实际代码开发过程中 xff0c 代码编写格式清晰与否不仅决定了自己的代码编写与维护成本 xff0c 也直接影响到项目的开发进度 编码中常用的有驼峰法和下划线两种编码格式 xff0c 其中驼峰法常用在面向对象的高层语言中 xff0c 下划线
  • 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    文章目录 一 前言二 RPC 基础概念1 RPC 是什么 xff1f 2 需要解决什么问题 xff1f 3 有哪些开源实现 xff1f 三 protobuf 基本使用1 基本知识2 使用步骤 四 libevent1 libevent 简介2
  • 针对vue的配置文件

    针对vue的配置文件 我们在根目录下创建一个 vue config js 文件 xff0c 将下方配置下去 module exports 61 区分打包环境与开发环境 process env NODE ENV 61 61 61 39 pro
  • Linux | LVM | 对比三种逻辑卷(Logic Volume)

    概述 为了满足在性能和冗余等方面的需求 xff0c LVM支持了下面三种Logic Volume xff1a Linear Logic Volume 线性逻辑卷Striped Logic Volume 条带化逻辑卷Mirror Logic
  • MySql ERROR 1129

    ERROR 1129 HY000 Host 39 mysql02 39 is blocked because of many connection errors unblock with 39 mysqladmin flush hosts
  • SpringBoot整合Shiro

    Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码学和会话管理 相比较Spring Security xff0c shiro有小巧 简单 易上手等的优点 所以很多框架都在使用shiro Shiro包含了三个
  • PB数据窗口对象之Button

    Button 重要属性 Action 属性 该属性是Button 控件最重要的一个属性 在数据窗口画板中 xff0c 可以选择一个按钮有哪个动作 可选的动作都是事先定义好的 xff0c 开发人员没有机会精确定义某个动作的执行 xff0c 只
  • 聊聊前端八股文?

    大家好 xff0c 我是若川 xff0c 点此加我微信进源码群 xff0c 一起学习源码 同时可以进群免费看Vue专场直播 xff0c 有尤雨溪分享 Vue3 生态现状以及展望 前些天 xff0c 我看到 剑指前端offer 一系列文章 x
  • 新手向:前端程序员必学基本技能——调试JS代码

    1前言 大家好 xff0c 我是若川 最近组织了源码共读活动 xff0c 感兴趣的可以加我微信 ruochuan12 参与 xff0c 已进行三个月了 xff0c 大家一起交流学习 xff0c 共同进步 想学源码 xff0c 极力推荐之前我

随机推荐

  • 全新的 Vue3 状态管理工具:Pinia

    大家好 xff0c 我是若川 最近组织了源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含
  • 推荐2022前端必看的新书 《Vue.js设计与实现》

    大家好 xff0c 我是若川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • 面试官问:跨域请求如何携带cookie?

    大家好 xff0c 我是若 川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系
  • 如何写好技术文章(看张鑫旭老师的直播总结

    大家好 xff0c 我是若川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • Element使用的async-validator表单校验库源码超详细解析

    大家好 xff0c 我是若川 持续组织了8个月源码共读活动 xff0c 感兴趣的可以 点此加我微信ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • 我捡到宝了!2022版前端面试上岸手册,最新最细致!

    大裁员背景下 xff0c 没什么比辞职后找不到工作更扎心 xff01 在行情好转前 xff0c 前端程序员只能 猥琐发育 xff0c 不轻易跳槽 xff0c 同时要修炼内功 xff1a 对八股文 底层源码 重点项目等进行查缺补漏 xff0c
  • 点击页面元素跳转IDE对应代码,试试这几个工具!

    大家好 xff0c 我是若川 我持续组织了近一年的源码共读活动 xff0c 感兴趣的可以 点此扫码加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整
  • 为什么说组件库的源码非常值得学习?

    大家好 xff0c 我是若川 最近来了一些新朋友 xff0c 感谢大家关注 相比于原生 JS 等源码 我们或许更应该学习正在使用的组件库的源码 xff08 如 xff1a element antd vant semi arco tdesig
  • 写一个Vue DevTools,让开发体验飞一会

    大家好 xff0c 我是若川 我持续组织了近一年的源码共读活动 xff0c 感兴趣的可以 点此扫码加我微信 lxchuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体
  • 偷偷盘点前端面试官才知道的进阶秘籍

    很多人都说35岁是程序员的职业尽头 而我们部门leader是位80年的大哥 xff0c 曾经是字节3 1大佬 xff0c 今年43岁了依然独当一面 于是 xff0c 我向他请教了 不被淘汰 的秘籍 他总结了两点 xff1a 1 努力修炼内功
  • Facebook CrypTen安全多方计算(MPC)框架介绍及核心代码分析

    简单介绍 CrypTen是Facebook在2019年10月开源的 用于多方安全计算 MPC 的框架 其底层依赖于深度学习框架PyTorch 官网说明见 xff1a https ai facebook com blog crypten a
  • 开源软件Asterisk:386变身交换机

    有关开源软件最令人激动的事情之一就是其创建超越传统的IT基础架构的应用程序的方式 一个恰当的例子是称作 Asterisk 的电话应用程序 Asterisk是一种功能非常齐全的应用程序 xff0c 提供了许多电信功能 也许它最著名的应用是当作
  • 2016.9---2017.1半年总,外派工作的感觉真爽 (补17年1月)

    16年8月份 xff0c 第二版订餐系统上线 xff0c 我就着手出去上班 xff0c 8月初提交简历后 xff0c 面试就一发不可收 xff0c 一直到12月初才出去 xff0c 历时四个月 xff0c 期间边学习边面试 xff0c 但这
  • gerrit - first commit

    最近公司有新项目 xff0c 已经让领导帮我把clone和push的权限都开通了 xff0c 但是在push的时候还是提交失败 xff0c 错误信息如下 xff1a git push origin master Counting objec
  • AutoML领域的一把利器---HyperGBM

    AutoML领域的一把利器 HyperGBM 文章目录 AutoML领域的一把利器 HyperGBM 前言一 何为AutoML xff1f 二 如何使用HyperGBM1 引入库2 读入数据3 初始化make experiment4 调用m
  • AutoML工具之HyperGBM介绍

    HyperGBM介绍 本文章主要是对autoML开源框架HyperGBM的一个介绍 文章目录 HyperGBM介绍一 关于HyperGBM二 功能特性总览二 如何安装HyperGBM三 HyperGBM入门样例1 准备数据集2 创建实验并进
  • HyperGBM如何定义autoML的搜索空间

    HyperGBM学习笔记之如何定义autoML搜索空间 文章目录 HyperGBM学习笔记之如何定义autoML搜索空间前言一 入门篇1 定义需求2 需求解析 二 进阶篇1 定义参数的搜索范围2 构建autoML伪代码3 HyperGBM定
  • HyperGBM之进化搜索算法

    HyperGBM学习笔记之进化搜索算法 文章目录 HyperGBM学习笔记之进化搜索算法一 什么是进化搜索算法 xff1f 二 HyperGBM中的变异算法实现1 构建进化搜索实例2 变异算法实现3 进化搜索算法整体流程 三 HyperGB
  • 机器学习之如何处理缺失值(missing value)

    机器学习之如何处理缺失值 备注 xff1a 本次数据来源于kaggle xff0c 详情请戳here xff0c 原文参考连接 xff0c 请戳here xff0c 本文篇幅较长 xff0c 旨在多介绍EDA过程中的一些思想和细节 文章目录
  • 机器学习中的早停策略

    前言 在做机器学习模型调优的时候 xff0c 往往会通过一系列的操作去提升调优效率 xff0c 其中有一种技术就是合理运用早停策略 关于数据集 xff1a 本文直接使用kaggle的数据集 xff0c 你可以直接点击链接下载 一 入门 1