一个GPU版本的遗传算法迭代xgboost最优参数的示例,这里用的是自定义损失函数

一个简单的遗传算法迭代xgboost最优参数的示例,这里用的是自定义损失函数

import pandas as pd
import numpy as np
import xgboost as xgb
from sko.GA import GA
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn import metrics
from log_color import log,LogLevel
from tqdm import tqdm
# from matplotlib import pyplot as plttrain_df = pd.read_csv('./train_v2.csv')
test_df =pd.read_csv('./test_v2.csv')x = train_df.drop(['user_id','merchant_id','label'],axis=1)
y = train_df['label']# ## 混合打乱数据
# y_to_numpy = y.to_numpy()
# x_to_numpy = x.to_numpy()
# m,n = x_to_numpy.shape
# y_to_numpy = y_to_numpy.reshape((m,1))
# xy = np.c_[x_to_numpy,y_to_numpy]# for i in tqdm(range(20),desc="随机打乱数据"):
#     np.random.shuffle(xy)# x,y = xy[:,0:13],xy[:,13:14]# log(f"x.shape:{x.shape},y.shape:{y.shape}",LogLevel.INFO)x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=0.2, random_state = 42)gamma = 0
### 自动计算alpha值的取值范围 取负例的比例
train_Y = y_train alpha = (train_Y==0).sum()/train_Y.sizedef logistic_obj(p, dtrain):y = dtrain.get_label()p = 1.0 / (1.0 + np.exp(-p))grad = p * (1 - p) * (alpha * gamma * y * (1 - p) ** gamma * np.log(p) / (1 - p) - alpha * y * (1 - p) ** gamma / p - gamma * p ** gamma * (1 - alpha) * (1 - y) * np.log(1 - p) / p + p ** gamma * (1 - alpha) * (1 - y) / (1 - p))hess = p * (1 - p) * (p * (1 - p) * (-alpha * gamma ** 2 * y * (1 - p) ** gamma * np.log(p) / (1 - p) ** 2 + alpha * gamma * y * (1 - p) ** gamma * np.log(p) / (1 - p) ** 2 + 2 * alpha * gamma * y * (1 - p) ** gamma / (p * (1 - p)) + alpha * y * (1 - p) ** gamma / p ** 2 - gamma ** 2 * p ** gamma * (1 - alpha) * (1 - y) * np.log(1 - p) / p ** 2 + 2 * gamma * p ** gamma * (1 - alpha) * (1 - y) / (p * (1 - p)) + gamma * p ** gamma * (1 - alpha) * (1 - y) * np.log(1 - p) / p ** 2 + p ** gamma * (1 - alpha) * (1 - y) / (1 - p) ** 2) - p * (alpha * gamma * y * (1 - p) ** gamma * np.log(p) / (1 - p) - alpha * y * (1 - p) ** gamma / p - gamma * p ** gamma * (1 - alpha) * (1 - y) * np.log(1 - p) / p + p ** gamma * (1 - alpha) * (1 - y) / (1 - p)) + (1 - p) * (alpha * gamma * y * (1 - p) ** gamma * np.log(p) / (1 - p) - alpha * y * (1 - p) ** gamma / p - gamma * p ** gamma * (1 - alpha) * (1 - y) * np.log(1 - p) / p + p ** gamma * (1 - alpha) * (1 - y) / (1 - p)))return grad, hess# class Myobj(xgb.core.):
#     def __call__(self,preds,label):
#         grad,hess = logistic_obj(preds,label)
#         return grad,hess#     def create_obj(self):
#         return selfdef XGBoostAUC(p):etas = [0.0001,0.001,0.01,0.1]sampling_methods = ["uniform","gradient_based"]# tree_methods = ["auto","exact","approx","hist"]w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17 = pparams = { #"objective":Myobj()"learning_rate":w1 #0.1, "n_estimators":int(w2)#11 #即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越 大,模型的效果往往越好。但是相应的,任何模型都有决策边  n_estimators达到一定的程度之后,随机森林的 精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越 长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。, "max_depth":int(w3) #构建树的深度,越大越容易过拟合, "min_child_weight":w4 #0.8 #越大min_child_weight,算法越保守。范围:[0,无穷大] 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束
#                , "num_class ":1#类别数,与 multisoftmax 并用, "gamma":w5 #损失下降多少才进行分裂, 控制叶子节点的个数, "subsample":w6#0.8 #随机采样训练样本#, "colsample_bytree":1 #生成树时进行的列采样
#                , "objective":'binary:logistic' # {'binary:logistic'}是二分类的问题,{'multi:softmax',}是多分类的问题 这个是优化目标,必须得有,因为xgboost里面有求一阶导数和二阶导数,其实就是这个。, "nthread":5 #cpu 线程数, "scale_pos_weight":(train_Y==0).sum()/(train_Y==1).sum() #负样本总数/正样本总数 。若训练负样本总数是500 ,正样本总数100,那么设置 scale_pos_weigh为 5, "lambda":w7#2 # 正则化参数, "eta":etas[int(w8)] #0.001 # 如同学习率, "verbosity":1 # 打印消息的详细程度。有效值为 0(静默)、1(警告)、2(信息)、3(调试)。
#                , metrics='auc', "eval_metric":"auc"
#                , "silent ": 0 # ,设置成1则没有运行信息输出,最好是设置为0., "seed":int(w9), "max_delta_step":w10 #范围:[0,无穷大] ,我们允许每个叶子输出的最大增量步长。如果该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。通常不需要此参数,但当类别极度不平衡时,它可能有助于逻辑回归。将其设置为 1-10 的值可能有助于控制更新。,"subsample":w11,"sampling_method":sampling_methods[int(w12)],'colsample_bytree':w13, 'colsample_bylevel':w14, 'colsample_bynode':w15,"gpu_id":0 # 使用GPU的参数1,"tree_method":"gpu_hist"#tree_methods[int(w16)]# #使用GPU的参数2,"max_leaves":int(w16) #要添加的最大节点数。不被树方法使用,"num_parallel_tree":int(w17) #每次迭代期间构建的并行树的数量。此选项用于支持增强随机森林}dtrain = xgb.DMatrix(x_train,label=y_train)clf = xgb.train(params=params,dtrain=dtrain,num_boost_round=100,evals=[(dtrain,"train")],verbose_eval=False # 不显示训练信息就改False,obj=logistic_obj)dtest = xgb.DMatrix(x_val,label=y_val)lr_proba = clf.predict(dtest)lr_proba = np.nan_to_num(lr_proba,0)fpr,tpr,threshold = metrics.roc_curve(y_val, lr_proba)roc_auc = metrics.auc(fpr,tpr)dtrain=Noneclf = Nonedtest = Nonelr_proba = Nonefpr,tpr,threshold = None,None,Nonelog(f"本次迭代AUC分数为:[{roc_auc}],本次X值为:[{p}]",LogLevel.PASS)return -roc_aucga = GA(func=XGBoostAUC, n_dim=17 #待求解的自变量数量, size_pop=10 #种群初始化个体数量 , max_iter=5 # 进化迭代次数, prob_mut=0.01 #变异概率, lb=[0.1,5,1,0,0,0,0,0,10,0,0,0,0,0,0,0,1] # 自变量下限,ub=[1,20,20,100,1,1,100,3,100,10,1,1,1,1,1,10,10] # 自变量上限,precision=[0.1,1,1,0.1,0.1,0.1,0.1,1,1,0.1,0.1,1,0.1,0.1,0.1,1,1] #精度)
best_x,best_y = ga.run()
print('best_x:', best_x,'\n','best_y:',best_y)opt_x_log = pd.DataFrame({"best_x":[best_x],"best_y":[best_y]
})
print(f"优化结果表:{opt_x_log}")
opt_x_log.to_csv("best_x2.csv")### 保存参数表
w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17 = best_xetas = [0.0001,0.001,0.01,0.1]
sampling_methods = ["uniform","gradient_based"]
params = { #"objective":Myobj()"learning_rate":w1 #0.1, "n_estimators":int(w2)#11 #即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越 大,模型的效果往往越好。但是相应的,任何模型都有决策边  n_estimators达到一定的程度之后,随机森林的 精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越 长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。, "max_depth":int(w3) #构建树的深度,越大越容易过拟合, "min_child_weight":w4 #0.8 #越大min_child_weight,算法越保守。范围:[0,无穷大] 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束#               
#                , "num_class ":1#类别数,与 multisoftmax 并用, "gamma":w5 #损失下降多少才进行分裂, 控制叶子节点的个数, "subsample":w6#0.8 #随机采样训练样本#, "colsample_bytree":1 #生成树时进行的列采样
#                , "objective":'binary:logistic' # {'binary:logistic'}是二分类的问题,{'multi:softmax',}是多分类的问题 这个是优化目标,必须得有,因为xgboost里面有求一阶导数和二阶导数,其实就是这个。, "nthread":5 #cpu 线程数, "scale_pos_weight":(train_Y==0).sum()/(train_Y==1).sum() #负样本总数/正样本总数 。若训练负样本总数是500 ,正样本总数100,那么设置 scale_pos_weigh为 5, "lambda":w7#2 # 正则化参数, "eta":etas[int(w8)] #0.001 # 如同学习率, "verbosity":1 # 打印消息的详细程度。有效值为 0(静默)、1(警告)、2(信息)、3(调试)。
#                , metrics='auc', "eval_metric":"auc"
#                , "silent ": 0 # ,设置成1则没有运行信息输出,最好是设置为0., "seed":int(w9), "max_delta_step":w10 #范围:[0,无穷大] ,我们允许每个叶子输出的最大增量步长。如果该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。通常不需要此参数,但当类别极度不平衡时,它可能有助于逻辑回归。将其设置为 1-10 的值可能有助于控制更新。,"subsample":w11,"sampling_method":sampling_methods[int(w12)],'colsample_bytree':w13, 'colsample_bylevel':w14, 'colsample_bynode':w15,"gpu_id":0 # 使用GPU的参数1,"tree_method":"gpu_hist"#tree_methods[int(w16)]# #使用GPU的参数2,"max_leaves":int(w16) #要添加的最大节点数。不被树方法使用,"num_parallel_tree":int(w17) #每次迭代期间构建的并行树的数量。此选项用于支持增强随机森林}
params.update({"best_auc":best_y})
best_params_table = pd.DataFrame({k:[v] for k,v in params.items()})
best_params_table.to_csv("best_params_table.csv")

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

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

相关文章

vscode Markdown 预览样式美化多方案推荐

优雅的使用 vscode写 Markdown,预览样式美化 1 介绍 我已经习惯使用 vscode 写 markdown。不是很喜欢他的 markdown 样式,尤其是代码块高亮的样式。当然用 vscode 大家基本上都会选择安装一个Markdown-preview-enhanced的插件,这个插件的确…

SpringBoot定时任务报错Unexpected error occurred in scheduled task原因及其解决方法(亲测有效)

问题 spring boot项目在线上一直正常运行没有错误,然后今天发生了报错,如图 这是一个定时器错误,发生这个报错 主要有两个原因 定时器编写的有错误Scheduled注解方式级别高于资源注入级别,导致了资源注入失败 以下是我的代码 …

单片机学习4——中断的概念

中断的概念: CPU在处理A事件的时候,发生了B事件,请求CPU迅速去处理。(中断产生) CPU暂时中断当前的工作,转去处理B事件。(中断响应和中断服务) 待CPU将B事件处理完毕后&#xff0…

【物联网开发】、【小程序蓝牙通讯数据校验】JS CRC-16-MODBUS 验证 高位在前地位在后;JS异或校验;16进制字符串和float互转

1.CRC校验 /*计算CRC-16/MODBUS校验位高低位*/ function calculateCRC16Modbus(dataHexString) {const dataBytes [];for (let i 0; i < dataHexString.length; i 2) {dataBytes.push(parseInt(dataHexString.substr(i, 2), 16));}let crc 0xFFFF;const polynomial 0x…

【数据结构初阶(5)】链式队列的基本操作实现

文章目录 队列的定义初始化队列队尾入队列队头出队列取队头元素取队尾元素获取队列有效元素个数判断队空销毁队列 因为队列比较简单&#xff0c;关于队列的概念就不过多赘述了&#xff0c;本文只讲链队的基本操作实现 队列的定义 定义队列结点结构 链队中的每个结点都应该包…

windows安装mysql5.7.26

解压mysql5.7.26文件夹拷贝到c:下 添加系统环境变量C:\mysql-5.7.26\bin cmd管理员打开终端,进入C:\mysql-5.7.26\bin 运行mysqld --initialize&#xff0c;生成data目录的文件。 在安装目录下创建my.ini文件&#xff0c;点击编辑&#xff0c;配置以下信息&#xff1a; 设置my…

Go 数字类型

一、数字类型 1、Golang 数据类型介绍 Go 语言中数据类型分为&#xff1a;基本数据类型和复合数据类型基本数据类型有&#xff1a; 整型、浮点型、布尔型、字符串复合数据类型有&#xff1a; 数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;、接口 2、…

什么是 dropblock

大家好啊&#xff0c;我是董董灿。 之前介绍过 dropout 算法&#xff0c;它在训练神经网络中&#xff0c;可以随机丢弃神经元&#xff0c;是一种防止网络过拟合的方法。 但是在卷积神经网络中&#xff0c;dropout 的表现却不是很好&#xff0c;于是研究人员又搞了一个“结构化…

Python列表:操作与实例分析,你值得一看!

Python列表是一种重要的数据结构&#xff0c;它允许您存储和管理多个数据项。本文将深入探讨Python列表的操作&#xff0c;以及通过具体实例分析如何使用它们&#xff0c;以帮助您更好地理解和优化您的代码。 什么是Python列表&#xff1f; Python列表是一种有序、可变的数据结…

基于51单片机的全自动洗衣机proteus仿真设计

标题目录 &#x1f4ab;51单片机全自动洗衣机proteus仿真设计&#x1f4ab;设计介绍&#x1f4ab;仿真图电动机驱动模块电路设计电源模块电路设计控制按键进水阀和排水阀控制继电器 &#x1f4ab;程序设计main函数 &#x1f4ab;设计报告&#x1f4ab;资料清单&&下载链…

递归实现选择排序.

思路: 1.定位数组中的最大元素或最小元素 2.将其与第一个元素交换位置 3.接着将剩余未排序的元素中的最大值或最小值与第二个元素交换位置 4.以此类推,直到排序完成 示例: [ 8, 5, 1, 9, 3 ] //原始数组 [ 1, 5, 8, 9, 3 ] //3与8交换 [ 1, 3, 8, 9, 5 ] //3与5交换 [ 1,…

PC行内编辑

点击编辑&#xff0c;行内编辑输入框出现&#xff0c;给列表的每条数据定义编辑标记&#xff0c;最后一定记得 v-model双向绑定&#xff0c;使数据回显。 步骤&#xff1a; 1、给行数据定义编辑标记 2、点击行编辑标记&#xff08;isedit&#xff09; 3、插槽根据标记渲染表单 …

探究Kafka原理-6.CAP理论实践

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

Transformer中的多头注意力机制-为什么需要多头?

Transformer为什么使用多头注意力机制呢&#xff1f; 多头可以学习到不同维度的特征和信息。为什么可以学习到不同维度的信息呢&#xff1f; 答案是&#xff1a;多头注意力机制的组成是有单个的self attention&#xff0c;由于self attention通过产生QKV矩阵来学习数据特征&a…

leetCode 1026. 节点与其祖先之间的最大差值 + 递归

1026. 节点与其祖先之间的最大差值 - 力扣&#xff08;LeetCode&#xff09; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。&#xff08;如果 A 的任何子节点之一为 B&am…

网络和Linux网络_5(应用层)HTTP协议(方法+报头+状态码)

目录 1. HTTP协议介绍 1.1 URL介绍 1.2 urlencode和urldecode 1.3 HTTP协议格式 1.4 HTTP的方法和报头和状态码 2. 代码验证HTTP协议格式 HttpServer.hpp 2.2 html正式测试 Util.hpp index.html 2.3 再看HTTP方法和报头和状态码 2.3.1 方法_GET和POST等 2.3.2 报头…

SpringBoot——国际化

优质博文&#xff1a;IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件&#xff1b; 【2】使用ResourceBundleMessageSource管理国际化资源文件&#xff1b; 【3】在页面使用ftp:message取出国际化内容&#xff1b; 二、SpringBoot编写国际化步骤 【1】创…

cJSON的使用——下载、打包与解析

目录 一、cJSON的下载 二、cJSON的常用函数 三、cJSON的打包例程 四、cJSON的解析例程1 五、cJSON的解析例程2 一、cJSON的下载 cjson下载 二、cJSON的常用函数 cJSON *cJSON_Parse(const char *value); 作用&#xff1a;将一个JSON数据包&#xff0c;按照cJSON结构体…

Day48:583. 两个字符串的删除操作、72. 编辑距离

文章目录 583. 两个字符串的删除操作思路代码实现 72. 编辑距离思路代码实现 583. 两个字符串的删除操作 题目链接 思路 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&am…

假设检验(一)假设检验的基本概念

文章目录 假设与检验规则两类错误假设检验的一般步骤参考文献 假设检验&#xff08;Test of Hypothesis&#xff09;是指&#xff0c;先对总体或总体的性质提出某项假设&#xff0c;再利用样本所提供的信息对提出的假设进行检验&#xff0c;以判断该假设是否成立。假设检验可分…