lightgbm实战-二分类问题(贝叶斯优化下调参方法)

2023-10-14 05:58

本文主要是介绍lightgbm实战-二分类问题(贝叶斯优化下调参方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# use bayes_opt
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score,KFold
from bayes_opt import BayesianOptimization
import numpy as np
# 产生随机分类数据集,10个特征, 2个类别
x, y = make_classification(n_samples=1000,n_features=10,n_classes=2)# 尝试一下用未调参的随机森林模型进行交叉验证
rf = RandomForestClassifier()
# 这里会输出5个值,取得均值
cv_score = cross_val_score(rf, x, y, scoring="f1", cv=5).mean()
cv_score# 定义一个函数,输入一些超参数,这些超参数就是需要进行调整的参数
def rf_cv(n_estimators, min_samples_split, max_features, max_depth):cv_score = cross_val_score(RandomForestClassifier(n_estimators=int(n_estimators),min_samples_split=int(min_samples_split),max_features=float(max_features), max_depth=int(max_depth),random_state=2),x, y, scoring="f1", cv=5).mean()# 必须返回一个值,如果像误差的话(回归算法)这里是需要加上一个负号的return cv_score
rf_bo = BayesianOptimization(rf_cv,{'n_estimators': (10, 250),'min_samples_split': (2, 25),'max_features': (0.1, 0.999),'max_depth': (5, 15)})
# 输出不同迭代参数组合下的得分
rf_bo.maximize()
# 输出最高得分下的参数组合
rf_bo.max

在这里插入图片描述
在这里插入图片描述

# 带入最佳参数进行计算
rf = RandomForestClassifier(random_state=2,max_depth=12,max_features=0.2694,min_samples_split=6,n_estimators=103)
np.mean(cross_val_score(rf, x, y, cv=4, scoring='f1'))

使用lightgbm尝试一波

# 设置几个参数
def lgb_cv(colsample_bytree, min_child_samples, num_leaves, subsample, max_depth):model = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',colsample_bytree=float(colsample_bytree), learning_rate=0.01,min_child_samples=int(min_child_samples), min_child_weight=0.001, n_estimators=800, n_jobs=-1, num_leaves=int(num_leaves),random_state=None, reg_alpha=0.0, reg_lambda=0.0,max_depth=int(max_depth),subsample=float(subsample))cv_score = cross_val_score(model, x, y, scoring="f1", cv=5).mean()return cv_score
# 使用贝叶斯优化
lgb_bo = BayesianOptimization(lgb_cv,{'colsample_bytree': (0.7,1),'min_child_samples': (2, 25),'num_leaves': (5, 250),'subsample': (0.7, 1),'max_depth':(2,10)})
lgb_bo.maximize()
lgb_bo.max
# 将优化好的参数带入进行使用
model = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',colsample_bytree=0.7111, learning_rate=0.01,min_child_samples=9, min_child_weight=0.001, n_estimators=800, n_jobs=-1, num_leaves=188,random_state=None, reg_alpha=0.0, reg_lambda=0.0,max_depth=2,subsample=0.91)
cv_score = cross_val_score(model, x, y, scoring="f1", cv=5).mean()
cv_score
# 结果就不放出来了,也就是一个值,大家可以模仿一下,跑跑代码。

接下里是采用lightgbm的自带的train方法配合交叉验证

def LGB_CV(max_depth,num_leaves,min_data_in_leaf,feature_fraction,bagging_fraction,lambda_l1):# 这里就不采用交叉验证的cv_score = cross_val_score(model, x, y, scoring="f1", cv=5)kf = KFold(n_splits=5,shuffle=True)# f是准备存储预测值的,交叉验证下,用五份数据作为验证集,最后将这五份数据放回f里f = np.zeros(x.shape[0])for index, (train_index, val_index) in enumerate(kf.split(x)):print("fold--{}".format(index))train_data = lgb.Dataset(x[train_index], label=y[train_index])val_data = lgb.Dataset(x[val_index], label=y[val_index])params = {'num_leaves': int(num_leaves),'min_data_in_leaf': int(min_data_in_leaf), 'objective':'binary','max_depth': int(max_depth),'learning_rate': 0.01,"boosting": "gbdt","feature_fraction": feature_fraction,"bagging_fraction": bagging_fraction ,"metric": 'auc',"lambda_l1": lambda_l1,}# 因为是交叉验证的算法,这里直接使用train,valid_sets就是要评估的数据集model = lgb.train(params, train_data, valid_sets=[train_data, val_data],num_boost_round=700, verbose_eval=500,early_stopping_rounds = 20)# 返回迭代中最好的数据,这里的predict里面的数据(不需要经过dataset)不需要再进行转化,如果是xgboost就需要,需要把x_test进行转化DMatrix(x_test),这里x_test不包含类别特征f[val_index] = model.predict(x[val_index], num_iteration=model.best_iteration)# predict里面的验证集不需要进行dataset,但是xgboost算法时需要dmatrix,并且只需要DMatrix(x_test),这里x_test不包含类别特征,很多地方这里都会出错,直接带着类别就去预测del model, train_index, val_index# 由于输出的是概率值,转化为0,1的整型值 f = np.array([1 if i>0.5 else 0 for i in oof])return metrics.f1_score(f, y)# 最后进行调参
LGB_CV(max_depth=5,num_leaves=32,min_data_in_leaf=15,feature_fraction=0.8,bagging_fraction=0.8,lambda_l1=None)# 采用贝叶斯优化算法
lgb_ba = BayesianOptimization(LGB_CV, {"max_depth":(2,12),"num_leaves":(5,130),"min_data_in_leaf":(5,30),"feature_fraction":(0.7,1),"bagging_fraction":(0.7,1),"lambda_l1":(0,6)})
lgb_ba.maximize()
lgb_ba.max["params"]

在这里插入图片描述

# 把设置好的参数带入
kf = KFold(n_splits=5,shuffle=True)
f = np.zeros(x.shape[0])
# 设置测试集数据
x_test = x[:200]
y_test = y[:200]
prediction = np.zeros(x_test.shape[0])
for index, (train_index, val_index) in enumerate(kf.split(x)):print("fold--{}".format(index))train_data = lgb.Dataset(x[train_index], label=y[train_index])val_data = lgb.Dataset(x[val_index], label=y[val_index])params = {'num_leaves': 44,'min_data_in_leaf': 19, 'objective':'binary','max_depth': 11,'learning_rate': 0.01,"boosting": "gbdt","feature_fraction": 0.81,"bagging_fraction": 0.84 ,"metric": 'auc',"lambda_l1": 1.8,}# 因为是交叉验证的算法,这里直接使用train,valid_sets就是要评估的数据集model = lgb.train(params, train_data, valid_sets=[train_data, val_data],num_boost_round=700, verbose_eval=500,early_stopping_rounds=20)f[val_index] = model.predict(x[val_index], num_iteration=model.best_iteration)# predict里面的数据不需要进行datasetprediction +=model.predict(x_test)num_iteration=model.best_iteration)/kf.n_splits
metrics.f1_score(np.array([1 if i>0.5 else 0 for i in prediction]), y_test)

在这里插入图片描述

题外话

这是kaggle上面的一种做法,也是非常高效的

这篇关于lightgbm实战-二分类问题(贝叶斯优化下调参方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/208611

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP