贝叶斯优化对lightGBM最优超参数进行估计

贝叶斯优化对lightGBM最优超参数进行估计
相对遗传算法和模拟退火来说,利用贝叶斯估计的算法对超参数调参有着明显的速度优势,因为是对历史运行参数进行高斯过程类的方法去估计,所以不需要在空间里反复随机的搜索,所以很快就能估计出一个比较不错的参数解。
但是相对前两种方法和粒子群优化之类的进化算法来说,贝叶斯估计容易受到历史参数统计的限制,难以像传统优化算法一样通过随机过程跳出局部空间。且对参数搜索空间的最优区间设置比较依赖,因为在有限的迭代此书中,设置的最优区间幅度会决定随机采样在全局最优解附近的概率,所以在逼近模型极限上往往不如传统的启发算法。

import pandas as pd
import numpy as np
import lightgbm as lgb
from sko.GA import GA
from sko.tools import set_run_mode
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn import metrics
from log_color import log,LogLevel
from tqdm import tqdm
from sklearn import metrics
from matplotlib import pyplot as plt
from sko.SA import SAFast
import time
import datetime
import os
import hyperopt
from hyperopt import hp
from sklearn.model_selection import KFold, cross_validate
from hyperopt import hp, fmin, tpe, Trials, partial
from hyperopt.early_stop import no_progress_losstrain_df = pd.read_csv('./train_v2.csv', index_col=0)
test_df = pd.read_csv('./test_v2.csv', index_col=0)
print(train_df)
x = train_df.drop(['user_id','merchant_id','label'],axis=1)
y = train_df['label']x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=0.2, random_state = 42)####TODO:自动计算alpha值的取值范围 取负例的比例
# train_Y = y_train 
train_positive = (y_train==1).sum()
train_negative = (y_train==0).sum()
train_y_counter = y_train.size
alpha = train_negative/train_y_counterlog(f"""训练数据中,正例有【{train_positive}】个占比【{train_positive/train_y_counter}】,负例有【{train_negative}】个占比【{train_negative/train_y_counter}】,alpha值为【{alpha}】,""",LogLevel.INFO)test_positive = (y_val==1).sum()
test_negative = (y_val==0).sum()
test_y_counter = y_val.size
log(f"""测试数据中,正例有【{test_positive}】个占比【{test_positive/test_y_counter }】,负例有【{test_negative}】个占比【{test_negative/test_y_counter }】,alpha值为【{test_negative/test_y_counter}】,""",LogLevel.INFO)def hyperopt_objective(hyperopt_params):func_start = time.time()params = {'verbose':-1,'min_data_in_leaf': int(hyperopt_params['min_data_in_leaf']),#一片叶子中的数据数量最少。可以用来处理过拟​​合注意:这是基于 Hessian 的近似值,因此有时您可能会观察到分裂产生的叶节点的观测值少于这么多'objective': 'binary','metric': 'auc','num_leaves': int(hyperopt_params['num_leaves']), #一棵树的最大叶子数"boosting": hyperopt_params["boosting"],#"gbdt",#gbdt 传统的梯度提升决策树,rf随机森林,dartDropout 遇到多个可加回归树,'n_estimators':int(hyperopt_params['n_estimators']),#2000,#基学习器"tree_learner":hyperopt_params["tree_learner"],#"feature",#serial:单机树学习器,feature:特征并行树学习器,data:数据并行树学习器,voting:投票并行树学习器'max_bin': int(hyperopt_params['max_bin']), #直方图分箱特征值的将被存储的最大箱数,少量的 bin 可能会降低训练准确性,但可能会增加处理过度拟合的能力# "min_data_in_bin":int(hyperopt_params["min_data_in_bin"]), #一个 bin 内的数据最少数量.使用它可以避免一数据一箱(潜在的过度拟合)'max_depth':int(hyperopt_params['max_depth']), #限制树模型的最大深度#"min_data_in_leaf":int(hyperopt_params["min_data_in_leaf"]),#一片叶子中的数据数量最少。可以用来处理过拟合"learning_rate": hyperopt_params["learning_rate"],#学习率#"colsample_bytree": 0.8,  "bagging_fraction": hyperopt_params["bagging_fraction"],  # 每次迭代时用的数据比例,但这将随机选择部分数据而不重新采样,可用于加速训练可以用来处理过拟​​合"feature_fraction":hyperopt_params["feature_fraction"], # 每次迭代中随机选择特征的比例,lightGBM 将在每次迭代(树)上随机选择特征子集1.0。例如,如果将其设置为0.8,LightGBM 将在训练每棵树之前选择 80% 的特征"lambda_l1":hyperopt_params["lambda_l1"], #L1正则化 0-正无穷"lambda_l2":hyperopt_params["lambda_l2"],'n_jobs': -1,#'silent': 1,  # 信息输出设置成1则没有信息输出'seed': int(hyperopt_params['seed']),'bagging_freq':int(hyperopt_params['bagging_freq']),#装袋频率,0表示禁用装袋;k意味着在每次迭代时执行装袋k。每次k迭代,LightGBM 都会随机选择用于下一次迭代的数据bagging_fraction * 100 %k'is_unbalance':hyperopt_params['is_unbalance'], #是否为不平衡数据"early_stopping_rounds":int(hyperopt_params["early_stopping_rounds"]),#早停法 如果一个验证数据的一个指标在最后几轮中没有改善,将停止训练"device_type":"cpu"#"cuda"#'scale_pos_weight': wt}  #设置出参数log(f"本次参数为:[{params}]",LogLevel.INFO)gbm = lgb.LGBMClassifier(**params)### 样本极度不均衡,直接K折交叉验证很有可能出现数据正负类一致而引起的lightGMB抛出错误# cv = KFold(n_splits=5,shuffle=True,random_state=1412)# roc_auc = cross_validate(gbm,X,y#                  ,scoring='roc_auc'#                  ,cv=cv#                  ,verbose=False#                  ,n_jobs=-1#                  ,error_score='raise'#                 )gbm.fit(x_train, y_train, # verbose_eval=True ,eval_metric='auc',eval_set=[(x_train, y_train), (x_val, y_val)]# ,early_stopping_rounds=30)gbm_pred = gbm.predict(x_val)gbm_proba = gbm.predict_proba(x_val)[:,1]fpr,tpr,threshold = metrics.roc_curve(y_val, gbm_proba)roc_auc = metrics.auc(fpr,tpr)func_end = time.time()global NOW_FUC_RUN_ITERNOW_FUC_RUN_ITER += 1log(f"""本次迭代AUC分数为:[{roc_auc}],用时:[{func_end-func_start}]秒,当前优化第:[{NOW_FUC_RUN_ITER}]次,已运行:[{NOW_FUC_RUN_ITER}]次,用时总计:[{datetime.timedelta(seconds=(func_end-Bayes_start_time))}]秒,""",LogLevel.PASS)return -roc_auc##TODO: 域空间,也就是给定超参数搜索的范围。这个可以通过 hyperopt 的 hp 方法实现,hp 方法有很多个参数选择的方式如
# hp.loguniform(对数空间搜索)
# 、hp.lognormal(对数正态分布)
# 、hp.normal(正态分布)
# 、hp.choice(列表选项搜索)
# 、hp.uniform(连续均匀分布搜索)
# 、hp.quniform(连续均匀分布整数搜索)param_grid_hp = {'min_data_in_leaf': hp.quniform('min_data_in_leaf',5,1000,1),'num_leaves': hp.quniform("num_leaves",20,1000,1), #一棵树的最大叶子数"boosting": hp.choice("boosting",["gbdt","rf"]),#gbdt 传统的梯度提升决策树,rf随机森林,dart Dropout 遇到多个可加回归树,'n_estimators':hp.quniform('n_estimators',80,2000,1),#基学习器"tree_learner": hp.choice("tree_learner",["feature","serial","data","voting"]),#serial:单机树学习器,feature:特征并行树学习器,data:数据并行树学习器,voting:投票并行树学习器'max_bin': hp.quniform("max_bin",20,1000,1),#50, #直方图分箱特征值的将被存储的最大箱数,少量的 bin 可能会降低训练准确性,但可能会增加处理过度拟合的能力'max_depth':hp.quniform('max_depth',5,100,1),#15, #限制树模型的最大深度# "min_data_in_leaf":hp.quniform("min_data_in_leaf",3,1000,1),#100,#一片叶子中的数据数量最少。可以用来处理过拟合"learning_rate": hp.uniform("learning_rate",0,1),#0.01,#学习率"bagging_fraction":hp.uniform("bagging_fraction",0.01,1),# 0.8,  # 每次迭代时用的数据比例,但这将随机选择部分数据而不重新采样,可用于加速训练可以用来处理过拟​​合"feature_fraction":hp.uniform("feature_fraction",0.01,1),#0.8, # 每次迭代中随机选择特征的比例,lightGBM 将在每次迭代(树)上随机选择特征子集1.0。例如,如果将其设置为0.8,LightGBM 将在训练每棵树之前选择 80% 的特征"lambda_l1":hp.randint("lambda_l1",1000),#20, #L1正则化 0-正无穷"lambda_l2":hp.randint("lambda_l2",1000),#20 ,'seed': hp.randint('seed',100),#42,'bagging_freq':hp.quniform("bagging_freq",0,100,1),#3,#0表示禁用装袋;k意味着在每次迭代时执行装袋k。每次k迭代,LightGBM 都会随机选择用于下一次迭代的数据'is_unbalance':hp.choice('is_unbalance',[True,False]),#True, #是否为不平衡数据"early_stopping_rounds":hp.quniform("early_stopping_rounds",1,1000,1),#30,#早停法 如果一个验证数据的一个指标在最后几轮中没有改善,将停止训练}  #设置出参数
t = 0
for params_name,obj in param_grid_hp.items():t += 1log(f"已准备优化的第{t}个参数,名称:{params_name},类型:{obj}",LogLevel.PASS)def param_hyperopt(max_evals=100):#保存迭代过程trials = Trials()#设置提前停止early_stop_fn = no_progress_loss(100)#定义代理模型#algo = partial(tpe.suggest, n_startup_jobs=20, n_EI_candidates=50)params_best = fmin(hyperopt_objective #目标函数, space = param_grid_hp #参数空间, algo = tpe.suggest #代理模型#, algo = algo, max_evals = max_evals #允许的迭代次数, verbose=True, trials = trials, early_stop_fn = early_stop_fn)#打印最优参数,fmin会自动打印最佳分数print("\n","\n","best params: ", params_best,"\n")return params_best, trialsBayes_start_time = time.time()
NOW_FUC_RUN_ITER = 0
NUM_EVALS = 100
params_best, trials = param_hyperopt(NUM_EVALS)log(f"所有搜索相关记录:{trials.trials[0]}",LogLevel.INFO)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app+ts----微信小程序锚点定位 、自动吸顶、滚动自动选择对应的锚点(点击tab跳转对应的元素位置)

uni-app----微信小程序锚点定位 、自动吸顶、滚动自动选择对应的锚点&#xff08;点击tab跳转对应的元素位置&#xff09; html代码部分 重点是给元素加入【 :id“‘item’ item.id”】 <view class"radiusz bg-white pt-[30rpx] z-[999]"><u-tabs:list&q…

INFINI Labs 产品更新 | 修复 Easysearch 跨集群复制索引同步问题,Gateway 内存异常增长等问题

INFINI Labs 产品又更新啦~&#xff0c;本次更新主要对 Easysearch、Gateway、Console、Agent 等产品功能进行优化和相关 Bug 修复&#xff0c;解决了内存异常增长等问题&#xff0c;以下是详细说明。 INFINI Easysearch v1.6.2 INFINI Easysearch 是一个分布式的近实时搜索与…

下载的ros工程如何运行,ros项目运行方法

举例: 节点: 重要的步骤已经标黑,然后如果是节点的话,就运行rosrun 文件名,文件名相关,用tab按键补全即可。 Create folder "catkin_ws/src" somewhereGo the new created folder, into src foldergit clone https://github.com/IaroslavS/listen_to_topic_an…

pywin32后台键鼠

1 后台键鼠操作 组合键不生效&#xff0c;并且按键按下会触发两次&#xff0c;不知道为什么&#xff1f;有大佬知道了&#xff0c;请指教一下&#xff01; import time import win32api import win32con import win32guiclass VirtualKeyboard:def __init__(self, hwnd):self…

机器学习---EM算法

1. 极大似然估计与EM算法 极大似然估计是一种常用的参数估计方法&#xff0c;它是以观测值出现的概率最大作为准则。关于极 大似然估计&#xff0c;假设现在已经取到样本值了&#xff0c;这表明取到这一样本的概率L(θ) 比较 大。我们自然不会考虑那些不能使样本出现的θ作为…

计算机基础知识62

模型层回顾&#xff1a;基本使用 # 模型层有orm框架&#xff1a;对象关系映射 数据库中&#xff1a;一个个表 &#xff1a;user表&#xff0c;book表&#xff0c;一条条的记录 程序中&#xff1a;一个个类&#xff0c;一个个对象 数据库中一张表---->程序中一个…

【超详细】vue项目:Tinymce富文本使用教程以及踩坑总结+功能扩展

【【超详细】vue项目&#xff1a;Tinymce富文本使用教程以及踩坑总结功能扩展 引言&#xff1a;一、 开始二、快速开始1、安装Tinymce 三、封装成Vue组件1、文件结构2、index.vue3、dynamicLoadScript.js4、plugin.js5、toolbar.js 四、使用Tinymce组件五、业务逻辑实现1、添加…

对外汉语教师简历(精选12篇)

以对外汉语老师招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴&#xff0c;希望能帮助大家在众多候选人中脱颖而出。 对外汉语教师简历下载&#xff08;在线制作&#xff09;&#xff1a;百度幻主简历或huanzhucv.c…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

Google Analytics(谷歌分析)是什么以及如何使用

Google Analytics&#xff08;谷歌分析&#xff09;是由Google提供的一款网络分析服务。该服务旨在帮助网站和应用程序的所有者更好地了解其用户的行为和交互&#xff0c;从而优化网站或应用的性能、用户体验和营销策略。Google Analytics 提供了丰富的数据和报告&#xff0c;涵…

IP地址十进制与二进制的转换

一、IPv4 十进制->二进制 def get_bin_v4(prefix):ip prefix.split(/)[0]mask prefix.split(/)[1]bin_all (.join([bin(int(x) 256)[3:] for x in ip.split(.)]))return bin_allprefix_v4 192.168.1.0/24 bin_mask_1 get_bin_v4(prefix_v4) print(bin_mask_1)输出如…

【Python表白系列】这个情人节送她一个漂浮的爱心吧(完整代码)

文章目录 漂浮的爱心环境需求完整代码详细分析系列文章 漂浮的爱心 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境也可以运行&#xff0c;如果想发给好朋友的话需要这…

21.Python 操作文件

目录 1. 认识文件和I/O2. 打开文件在异常处理语句中打开在上下文管理中打开 3.读取文件3. 写入文件4. 删除文件5. 复制文件6. 重命名文件7. 文件查找和替换 1. 认识文件和I/O 文件是存储在设备上的一组字符或字节序列&#xff0c;可以包含任何内容&#xff0c;它是数据的集合和…

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…

【自动化测试】Selenium IDE脚本编辑与操作(了解)

之前&#xff0c;我们录制脚本时是录制鼠标和键盘的所有在浏览器的操作&#xff0c;那么脚本会出现多余的步骤&#xff0c;有时候我们需要手动填写脚本或修改脚本&#xff0c;所以我们有必要对selenium IDE脚本编辑与操作有所了解&#xff1b;&#xff08;采用录制的方式很容易…

k8s学习

文章目录 前言一、k8s部署方式二、学习k8s的方式今天主要配置k8s环境的方式今天遇到的是一个在k8s进行初始化的方式&#xff0c;但是发现k8s不能正常初始化总是出现错误&#xff0c;或者在错误中有问题的方式&#xff0c;在网上查询挺多资料需要重新启动kub文件&#xff0c;删除…

jdk8、jdk9中,接口的新特性

接口的老特性&#xff1a; 没有构造方法成员变量只能定义常量&#xff0c;默认三个关键字public static final只能是抽象方法&#xff0c;默认两个关键字public abstract 接口的新特性&#xff1a; jdk8 1.接口允许定义非抽象方法&#xff0c;需加入default关键字。为了解决…

Java+SSM+MySQL基于微信小程序的商城购物小程序(附源码 调试 文档)

基于微信小程序的商城购物小程序 一、引言二、国内外研究现状三、系统设计四、系统实现五、测试与评估六、结论七、界面展示八、源码获取 摘要&#xff1a; 本文介绍了一种基于微信小程序的商城购物小程序&#xff0c;该系统分为管理员和用户两种用户角色。管理员可以通过系统进…

流量内存cpu使用率使用工具

类似360工具球的工具 我提供了夸克下载喜欢的朋友可以直接下载使用 我用夸克网盘分享了「TrafficMonitor」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了&#xff0c;装一下linux系统玩一下。 使用工具如下&#xff1a;一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…