XGBOOST案例

最近我在Kaggle上找到一个跟XGBOOST相关的代码,这有助于我们去实战性的学习。

这段代码旨在使用XGBoost和TPU进行大规模的分子绑定预测。

比赛项目:NeurIPS 2024 - Predict New Medicines with BELKA | Kaggle

训练样本代码:

上图是我们已经处理好的训练样本,右边三列是我们要去预测的蛋白质

import numpy as np  # linear algebra
import pandas as pd  # data processing, CSV file I/O (e.g. pd.read_csv)
import pickle
import random, os, gc
from scipy import sparse
from sklearn.metrics import average_precision_score
from sklearn.feature_selection import VarianceThreshold
from xgboost import DMatrix
import xgboost as xgb
from sklearn.model_selection import StratifiedKFold
import tensorflow as tf

这部分导入了所需的库,包括NumPy、Pandas、Pickle、SciPy、Scikit-learn、XGBoost和TensorFlow。VarianceThreshold是方差阈值。

# Detect hardware, return appropriate distribution strategy
try:tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect(tpu="local")  # "local" for 1VM TPUstrategy = tf.distribute.TPUStrategy(tpu)print("Running on TPU")print("REPLICAS: ", strategy.num_replicas_in_sync)
except tf.errors.NotFoundError:strategy = tf.distribute.get_strategy()  # Default strategy for CPU/GPUprint("Not on TPU, running on ", strategy)

这是我在源代码的基础上增添了在TPU上训练,尝试连接TPU集群。如果连接成功,使用TPUStrategy,否则使用默认的分布式策略。

1. TPUClusterResolver:
   - `TPUClusterResolver` 是 TensorFlow 中用于连接 TPU 群集的类。在这段代码中,使用 `TPUClusterResolver.connect(tpu="local")` 尝试连接本地的 TPU 资源。参数 `"local"` 表示连接到单个虚拟机(1VM)上的 TPU。
   - 如果成功连接到 TPU,就会创建一个 `TPUStrategy` 对象 `strategy`,用于在 TPU 上进行分布式训练。

2. TPUStrategy:
   - `TPUStrategy` 是 TensorFlow 中专门为 TPU 设计的分布策略。它可以管理和分发计算任务到 TPU 设备上,并提供了一些工具和接口来简化在 TPU 上的模型训练过程。

3. Fallback to CPU/GPU:
   - 如果无法连接到 TPU(捕获到 `tf.errors.NotFoundError`),则执行 `tf.distribute.get_strategy()`,该函数返回默认的策略,通常是针对 CPU 或 GPU 的单机训练策略。
   - `get_strategy()` 返回的是 `MirroredStrategy`,用于在单个设备(单机多 GPU)上进行分布式训练。

4. 输出信息:
   - 如果连接成功,输出 "Running on TPU" 并打印 TPU 群集的 REPLICA 数量。
   - 如果连接失败(没有找到 TPU),输出 "Not on TPU, running on " 后面跟着默认策略(通常是 CPU 或 GPU)的信息。

因此,这段代码展示了如何在 TensorFlow 中利用 `TPUClusterResolver` 和 `TPUStrategy` 来实现分布式训练,并在没有 TPU 可用时回退到 CPU/GPU 上进行训练。
输出信息示例

# 设置随机种子的函数,确保结果的可重复性
def seed_everything(seed: int):random.seed(seed)np.random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)# 设置随机种子为42
seed_everything(42)

定义并调用seed_everything函数,设置随机种子为42,以确保结果的可重复性。

# 函数:打印数据框的基本属性
def fold_properties(df):print('Shape :', df.shape)print('block1 :', df.buildingblock1_smiles.nunique())print('block2 :', df.buildingblock2_smiles.nunique())print('block3 :', df.buildingblock3_smiles.nunique())for target in TARGETS:print(f'Positive Cases Ratio for {target} :', target, (df[target].sum() / df.shape[0]))

定义fold_properties函数,用于打印数据框的基本属性,包括形状、唯一值数量和目标列的正样本比例。

唯一值数量举例:

   学号    姓名    年龄   成绩
0  1001   小明    18    85
1  1002   小红    17    90
2  1003   小刚    18    88
3  1004   小丽    17    92

  • 学号 列中的唯一值数量为 4,因为有四个不同的学号。
  • 姓名 列中的唯一值数量为 4,因为每个学生的姓名都是唯一的。
  • 年龄 列中的唯一值数量为 2,因为只有 17 岁和 18 岁两种可能的年龄。
  • 成绩 列中的唯一值数量为 4,因为每个学生的成绩都是唯一的。

通过计算每列唯一值的数量,我们可以快速了解数据的一些基本特征,比如类别型特征的多样性程度,数值型特征的离散程度等。

 示例输出信息

# 目标变量列表
TARGETS = ['binds_BRD4', 'binds_HSA', 'binds_sEH']

定义目标变量列表。

# 指定数据类型的字典
dtypes = {'buildingblock1_smiles': np.int16,'buildingblock2_smiles': np.int16,'buildingblock3_smiles': np.int16,'binds_BRD4': np.byte,'binds_HSA': np.byte,'binds_sEH': np.byte
}

指定数据类型的字典,用于读取CSV文件时指定列的数据类型。

# 从CSV文件中读取训练数据,只使用指定列,并指定数据类型
train = pd.read_csv('/kaggle/input/leashbio-10m-data-sample/train_sample.csv', dtype=dtypes, usecols=[0, 1, 2, 4, 5, 6])

从CSV文件中读取训练数据,只使用指定的列,并指定数据类型。

# 打印训练数据的基本属性
print('Train Sample Properties')
fold_properties(train)

打印训练数据的基本属性。

# 加载稀疏矩阵train_ecfp
train_ecfp = sparse.load_npz("/kaggle/input/leashbio-10m-data-sample/train_ecfp.npz")
print('train_ecfp Shape :', train_ecfp.shape)

加载稀疏矩阵train_ecfp并打印其形状。

# 获取训练数据中的唯一smiles列表
train_B1_unique = train.buildingblock1_smiles.unique().tolist()
train_B2_unique = train.buildingblock2_smiles.unique().tolist()
train_B3_unique = train.buildingblock3_smiles.unique().tolist()
train_unique_smiles = set(train_B1_unique + train_B2_unique + train_B3_unique)

获取训练数据中每个块的唯一smiles列表并合并成一个集合。

# 使用VarianceThreshold进行特征选择,选择方差大于0.005的列
var_thresh = VarianceThreshold(threshold=0.005)
var_thresh.fit(train_ecfp[:100000].A)
var_thresh_index_1 = var_thresh.get_support()
train_ecfp_1 = train_ecfp[:, var_thresh_index_1]
print('train_ecfp Shape after Variance Threshold:', train_ecfp_1.shape)

使用VarianceThreshold进行特征选择,选择方差大于0.005的列,并打印处理后的train_ecfp形状。

# K折交叉验证参数设置
folds = 5
skf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=42)

设置K折交叉验证的参数。

# 模型训练参数设置
iterations = 5000
early_stopping_rounds = 100
verbose_eval = 100
xgb_models = []  # 存储训练好的XGBoost模型列表
valid_preds_score = []  # 存储验证集的预测分数列表with strategy.scope():  # 在策略范围内进行模型训练for i, target in enumerate(TARGETS):print(f'training target {target}')fold_scores = []  # 存储每个折的分数for fold, (train_idx, valid_idx) in enumerate(skf.split(train, train[target])):print(f'Fold {fold+1}')X_tr, X_val = train_ecfp_1[train_idx, :], train_ecfp_1[valid_idx, :]y_tr, y_val = train[target].values[train_idx], train[target].values[valid_idx]xtrain = DMatrix(data=X_tr, label=y_tr)xvalid = DMatrix(data=X_val, label=y_val)scale_pos_weight = (len(y_tr) - y_tr.sum()) / y_tr.sum()  # 计算scale_pos_weightprint('scale_pos_weight :', scale_pos_weight)xgb_params = {'objective': 'binary:logistic',  # 二分类逻辑回归'eval_metric': 'aucpr',  # 评估指标为AUC-PR'learning_rate': 0.1,  # 学习率"n_jobs": 12,  # 并行工作数"seed": 42,  # 随机种子'colsample_bytree': 0.8,  # 每棵树使用的特征列比例'scale_pos_weight': scale_pos_weight  # 正负样本权重比例}# 训练XGBoost模型XModel = xgb.train(xgb_params, xtrain,evals=[(xvalid, 'validation')],verbose_eval=verbose_eval,early_stopping_rounds=early_stopping_rounds,xgb_model=None,num_boost_round=iterations)# 在验证集上进行预测,并计算平均精度分数(MAP)y_pred_proba = XModel.predict(xvalid)  # 预测正类的概率map_score = average_precision_score(y_val, y_pred_proba)  # 计算平均精度分数fold_scores.append(map_score)  # 将分数添加到列表中print(f"Mean Average Precision for Fold {fold+1} Valid {target}: {map_score:.2f}")xgb_models.append(XModel)  # 将训练好的模型添加到列表中mean_map_score = np.mean(fold_scores)print(f"Mean Average Precision for Valid {target} across all folds: {mean_map_score:.2f}")valid_preds_score.append(mean_map_score)  # 将平均分数添加到列表中

在策略范围内进行模型训练,使用5折交叉验证训练每个目标变量的XGBoost模型,并计算平均精度分数。

# 打印每个目标变量的平均MAP分数
print('binds_BRD4 :', valid_preds_score[0])
print('binds_HSA :', valid_preds_score[1])
print('binds_sEH :', valid_preds_score[2])

打印每个目标变量的平均MAP分数。

# 清理内存
del train, xtrain, X_tr, xvalid, X_val, y_tr, y_val, valid_preds_score
gc.collect()

清理内存,删除不再需要的变量,并进行垃圾回收。

# 创建用于存储预测结果的DataFrame
preds_cols = ['BRD4', 'HSA', 'sEH']
test = pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet', engine='pyarrow')  # 读取测试集数据blocks_dict = np.load('/kaggle/input/leashbio-10m-data-sample/blocks_dict.npy', allow_pickle=True)  # 加载blocks_dict
blocks_dict = blocks_dict.tolist()  # 转换为字典格式# 将测试集中的smiles映射为对应的整数值并转换为uint16类型
test['buildingblock1_smiles'] = test['buildingblock1_smiles'].map(blocks_dict).values.astype('uint16')
test['buildingblock2_smiles'] = test['buildingblock2_smiles'].map(blocks_dict).values.astype('uint16')
test['buildingblock3_smiles'] = test['buildingblock3_smiles'].map(blocks_dict).values.astype('uint16')

读取测试集数据,将smiles映射为对应的整数值,并转换为uint16类型。

# 创建用于存储预测结果的DataFrame
test_preds = pd.DataFrame(test['molecule_smiles'].unique(), columns=['molecule_smiles'])# 复制并去重测试集的smiles列
test_preds = test[['molecule_smiles', 'buildingblock1_smiles', 'buildingblock2_smiles', 'buildingblock3_smiles']].copy().drop_duplicates()

创建用于存储预测结果的DataFrame,并去重smiles

# 加载测试集的ECFP特征
test_ecfp = sparse.load_npz("/kaggle/input/leashbio-10m-data-sample/test_ecfp.npz")
test_ecfp_1 = test_ecfp[:, var_thresh_index_1]
print('test_ecfp Shape after Variance Threshold:', test_ecfp_1.shape)

加载测试集的ECFP特征,并应用方差阈值处理。

# 获取测试集中的唯一smiles列表
test_B1_unique = test_preds.buildingblock1_smiles.unique().tolist()
test_B2_unique = test_preds.buildingblock2_smiles.unique().tolist()
test_B3_unique = test_preds.buildingblock3_smiles.unique().tolist()
test_unique_smiles = set(test_B1_unique + test_B2_unique + test_B3_unique)

获取测试集中的唯一smiles列表。

# 初始化预测结果列为0
test_preds[preds_cols] = np.zeros((len(test_preds), 3))print('Shape Test :', test.shape)
test_no_overlap = [bb for bb in test_unique_smiles if bb not in train_unique_smiles]
train_no_overlap = [bb for bb in train_unique_smiles if bb not in test_unique_smiles]
print('Test Block Unique :', len(test_unique_smiles))
print('Train Block Unique :', len(train_unique_smiles))
print('Test Block not in train :', len(test_no_overlap))
print('Train Block not in test :', len(train_no_overlap))

初始化预测结果列为0,并打印测试集的形状和唯一smiles数量及其重叠情况。

# 针对每个目标变量进行预测
for i, target in enumerate(TARGETS):test_target = target.split('_')[1]test_preds[test_target] = xgb_models[i].predict(DMatrix(data=test_ecfp_1))

使用训练好的XGBoost模型进行预测,并将结果存储在test_preds中。

# 创建预测结果DataFrame,分别存储每个目标变量的预测结果
test_BRD4 = test_preds[['molecule_smiles', 'BRD4']].copy()
test_BRD4['protein_name'] = 'BRD4'
test_BRD4 = test_BRD4.rename(columns={"BRD4": "binds_1"})test_HSA = test_preds[['molecule_smiles', 'HSA']].copy()
test_HSA['protein_name'] = 'HSA'
test_HSA = test_HSA.rename(columns={"HSA": "binds_1"})test_sEH = test_preds[['molecule_smiles', 'sEH']].copy()
test_sEH['protein_name'] = 'sEH'
test_sEH = test_sEH.rename(columns={"sEH": "binds_1"})

创建预测结果DataFrame,分别存储每个目标变量的预测结果。

# 合并三个目标变量的预测结果
test_preds_1 = pd.concat([test_BRD4, test_HSA, test_sEH])# 将预测结果与原始测试集合并,保留'molecule_smiles'和'protein_name'列,并按左连接方式合并
test = pd.merge(test, test_preds_1, on=['molecule_smiles', 'protein_name'], how='left')

合并三个目标变量的预测结果,并与原始测试集合并。

# 读取示例提交文件,用预测结果替换绑定概率列,并保存为CSV文件
sample_submission = pd.read_csv("/kaggle/input/leash-BELKA/sample_submission.csv")
sample_submission['binds'] = test['binds_1']
sample_submission.to_csv('submission.csv', index=False)
sample_submission.head()

读取示例提交文件,用预测结果替换绑定概率列,并保存为CSV文件。

# 打印预测结果的统计信息:最大值、最小值、平均值
print(sample_submission.binds.max())
print(sample_submission.binds.min())
print(sample_submission.binds.mean())

打印预测结果的统计信息:最大值、最小值、平均值。

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

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

相关文章

Kubernetes集群中如何利用北极星因果指标设置正确的POD规格——CPU篇

在 Kubernetes 容量规划中,追求的是集群的稳定性和资源使用效率之间的平衡: 资源分配过多会造成浪费。 资源分配过少则会导致用户请求时延上升,影响集群的稳定性。 背景 公众号之前翻译了一篇 Sysdig 的文章,Kubernetes 容量规…

Golang | Leetcode Golang题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; func merge(head1, head2 *ListNode) *ListNode {dummyHead : &ListNode{}temp, temp1, temp2 : dummyHead, head1, head2for temp1 ! nil && temp2 ! nil {if temp1.Val < temp2.Val {temp.Next temp1temp1 temp1.Next} …

IDEA中Remote JVM Debug太爽了,远程调试连接

一&#xff1a;前言 &#xff08;1&#xff09;项目部署到线上之后出现问题&#xff0c;只能看日志但是还是不能确定具体问题&#xff0c;想要使用debug调试一下&#xff0c;看一下具体出现的问题 &#xff08;2&#xff09;idea真的是一款超级强大的开发工具&#xff0c;可以…

YonSuite银企直联:成长型企业数智转型的强力引擎

在当今数字化转型的浪潮中&#xff0c;成长型企业正面临着前所未有的发展机遇与挑战。在这场数字化转型的竞技场上&#xff0c;银企直联凭借其独特的优势&#xff0c;成为企业金融管理的重要利器&#xff0c;为企业带来前所未有的资金管理体验。用友YonSuite作为领先的数智化转…

网站改成HTTPS方法

网站改成HTTPS只要网站没有特殊性的要求&#xff0c;绝大部分网站很轻松的就可以完成&#xff0c;尤其是CMS类似的网站系统或者自助搭建的网站&#xff08;比如&#xff1a;这种网站可以在网站后台一次性安装并且生效&#xff09;。 基本要求 将网站改成HTTPS有2个前提&#…

[环境配置]vscode通过ssh连接autodl进行项目开发

警告&#xff1a;如果使用VSCode直接执行或开终端执行训练程序&#xff0c;请在调试完成后最后通过screen/tmux工具开守护进程&#xff0c;确保程序不受SSH连接中断影响程序执行&#xff01; 官方文档&#xff1a;请戳 AutoDL使用方法&#xff1a; 在进行操作前您需要提前安装…

subversion

subversion Install # CentOS安装Subversion yum install subversion mkdir /var/svn/ systemctl restart svnserve# Docker安装Subversion&#xff08;参考&#xff1a;https://github.com/garethflowers/docker-svn-server&#xff09; docker run \--name my-svn-server \…

辛弃疾,笔墨剑影的一生

辛弃疾&#xff0c;字幼安&#xff0c;号稼轩&#xff0c;生于南宋高宗赵构绍兴十年&#xff08;公元1140年&#xff09;&#xff0c;卒于南宋宁宗赵扩嘉泰元年&#xff08;公元1207年&#xff09;&#xff0c;享年67岁。他是中国南宋时期著名的爱国词人&#xff0c;与苏轼并称…

《C语言》动态内存管理

文章目录 一、动态内存分配二、关于动态内存开辟的函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态开辟内存使用free释放4、释放free释放一块动态开辟的内存的一部分5、对同一块动态内存多…

怎么学习汇川Codesys PLC教程?

前言 各位好&#xff0c;我在B站和抖音上都有发布视频的&#xff0c;搜索我的名称“阿凡工控分享”即可。在CSDN上发表文章也是想把我的一点见解和经验分享出来&#xff0c;进一步的方便大家进行学习。 我是正文 本文主要也是为了方便大家学习汇川的Codesys PLC而制作的&…

struts2框架漏洞

title: struts2框架漏洞 categories: 漏洞复现 abbrlink: 48203 date: 2024-06-14 15:45:27 前言知识 ognl表达式注入 对象导航图语言&#xff0c;用于访问对象的字段、方法。基于简化访问java对象属性和调用方法需求&#xff0c;实现字段类型转化等功能&#xff1b;访问列表…

高分论文密码---大尺度空间模拟预测与数字制图

大尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中&#xff0c;号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律&#xff0c;又可以为复杂的机理过程模型大尺度模拟提供技术基础。我们将结合一些经典…

板凳----Linux/Unix 系统编程手册 25章 进程的终止

25.1 进程的终止&#xff1a;_exit()和exit() 440 1. _exit(int status)&#xff0c; status 定义了终止状态&#xff0c;父进程可调用 wait 获取。仅低8位可用&#xff0c;调用 _exit() 总是成功的。 2.程序一般不会调用 _exit()&#xff0c; 而是调用库函数 exit()。exit() …

《QT实用小工具·七十》openssl+qt开发的P2P文件加密传输工具

1、概述 源码放在文章末尾 该项目实现了P2P的文件加密传输功能&#xff0c;具体包含如下功能&#xff1a; 1、 多文件多线程传输 2、rsaaes文件传输加密 3、秘钥随机生成 4、断点续传 5、跨域传输引导服务器 项目界面如下所示&#xff1a; 接收界面 发送界面 RSA秘钥生成…

从0到1搭建MCU芯片上操作系统环境。开发都需要哪些环节和准备

MCU芯片环境搭建与操作系统上载步骤 1. 硬件准备 选择合适的MCU芯片&#xff0c;例如STM32、GD32等。 准备开发板&#xff0c;用于硬件连接和实验。 准备必要的外围设备&#xff0c;如电源适配器、USB转串口模块等。 2. 软件环境搭建 安装编程语言环境&#xff0c;如C/C编译…

SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解

Memcached下载和安装 是一个国内使用量还是比较大的技术 打开文件夹 我们需要在命令行窗口启动 注意要以管理员方式运行 先尝试进入指定文件 然后又再次运行 下载 memcached.exe -d install 启动 memcached.exe -d start 停止 memcached.exe -d stop memcached.exe -d i…

springboot原理篇-bean管理

springboot原理篇-bean管理&#xff08;二&#xff09; 我们今天主要学习IOC容器中Bean的其他使用细节&#xff0c;主要学习以下三方面&#xff1a; 如何从IOC容器中手动的获取到bean对象bean的作用域配置管理第三方的bean对象 一、获取Bean 了解即可&#xff0c;默认情况下…

管理员如何踢掉登录用户?

这是 Spring Security 学习小组有小伙伴提的一个问题&#xff1a; 感觉这个问题还有点意思&#xff0c;拿出来和各位小伙伴一起分享下。 一 问题分析 首先大家注意限制条件&#xff1a;常规 Session 方案。 如果不是这几个字&#xff0c;这个问题根本就不是问题&#xff0c;…

确定线性稳压器的包装限制范围

工程师喜欢低压差 (LDO) 线性稳压器&#xff0c;因为它们简单、易于使用、价格低廉和低噪声。典型的线性稳压器仅需要几个外部电容器和电阻器即可完全实现 DC/DC 转换器。 通常&#xff0c;工程师根据数据表前面列出的一些规格来选择线性稳压器&#xff0c;这些规格概述了稳压…

vim 的 map+noremap

经常在 vim 的配置文件中&#xff0c;看到对于改键的设置。 他们的区别主要有两种 1 用于哪种模式。 2 是否用于递归。