首届世界科学智能大赛:生命科学赛道——生物学年龄评价与年龄相关疾病风险预测(第一次笔记)

本文介绍了首届世界科学智能大赛生命科学赛道的任务,即利用甲基化数据预测生物学年龄和疾病风险。文章阐述了赛事背景、数据集特征及处理、模型训练与验证,采用的机器学习模型包括XGBoost、LightGBM和CatBoost,通过特征选择和数据预处理提升模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.背景介绍

本次笔记参考Datawhale AI夏令营(第三期) - AI for Science 生命科学赛道学习手册

本次赛题全称为【首届世界科学智能大赛:生命科学赛道——生物学年龄评价与年龄相关疾病风险预测】 举办方:
请添加图片描述

【赛题背景】
生物学年龄评价是一种通过测量和分析生物体内特定指标或生理过程的状态,以评估个体的生理年龄和健康状况的方法。与传统的日历年龄相比,生物学年龄可以提供更准确的健康评估和疾病风险预测。随着 AI 技术的不断发展,计算科学与生命科学的整合与发展将为健康管理应用开发、衰老机制研究、抗衰老药物研发提供前沿的思路与方法。基于上述背景,举办基于甲基化测量数据预测生物学年龄的比赛。

【赛事安排】
https://tianchi.aliyun.com/s/6a1351ecd2a3987995a7bda7f62542d2

【赛事任务】
本次比赛提供健康人和年龄相关疾病患者的甲基化数据,选手通过分析甲基化数据的模式和特征建立预测模型,可以根据某个人的甲基化数据来预测其生物学年龄

【赛题数据集】
公开数据包含10296个样本,其中7833个样本为健康样本。每一个样本提供485512个位点的甲基化数据、年龄与患病情况,也就是有485512个特征。

训练策略:抽取80%作为训练样本,20%作为测试样本。

以训练集为例,一共包括8233样本,其中健康样本6266个,其余为患病样本,共涉及Alzheimer’s disease,schizophrenia,Parkinson’s disease,rheumatoid arthritis,stroke,Huntington’s disease,Graves’ disease,type 2 diabetes,Sjogren’s syndrome等类型。

【评价指标】
本次任务采用多个指标来进行评测,初赛和复赛评价指标有差异。初赛是将两个指标(健康样本MAE和患病样本MAE)进行计算,取平均得到最终分数。
请添加图片描述

【解题思路】
本题初赛任务是预测样本年龄,属于典型的回归问题。

  • 输入数据为每一个样本对应的485512个位点的甲基化数据与患病情况
  • 输出为样本对应年龄。

可以看到所提供的特征纬度非常高(485512维),可以考虑基本的特征选择,比如考虑覆盖率、相关性、特征重要性等。或者仅使用部分特征,快速跑通流程,后续在考虑如何添加更多特征,也是一个不错的选择。

模型方面可以选择机器学习模型或深度学习模型,如果使用类似 xgboost 这类机器学习模型,是不需要进行缺失值填充和数据标准化操作的,效果比较稳定。如果选择深度学习模型,则要进行缺失值填充和数据标准化操作,网络搭建也需要更多的尝试。

鉴于上面的对比,我们Baseline选择使用机器学习方法,在解决机器学习问题时,一般会遵循以下流程:
请添加图片描述

2.跑通baseline

2.1 环境配置

由于本次数据集过大,我们使用阿里云云环境,具体部署教程如下:

https://datawhaler.feishu.cn/docx/GIr5dWijEoGWRJxzSeCcZFmgnAe?from=from_copylink

2.2 baseline分析

导入库
Copy code
import numpy as np
import pandas as pd
import polars as pl
from collections import defaultdict, Counter
import xgboost as xgb
import lightgbm as lgb
from catboost import CatBoostRegressor
from sklearn.model_selection import StratifiedKFold, KFold, GroupKFold
from sklearn.metrics import mean_squared_log_error
import sys, os, gc, argparse, warnings

在这部分代码中,导入了各种用于数据处理、模型训练和评估的库,包括 NumPy、Pandas、Polars、collections、XGBoost、LightGBM、CatBoost、Scikit-learn 中的交叉验证模块和评估指标模块,以及其他用于处理命令行参数和警告信息的库

这是一个用于减少 DataFrame 内存使用的函数。它遍历 DataFrame 的每一列,根据数值类型对列的数据类型进行转换,从而减少内存使用
# 定义一个函数,用于减少DataFrame的内存使用
def reduce_mem_usage(df, verbose=True):
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] # 定义数值类型列表
    start_mem = df.memory_usage().sum() / 1024**2    # 计算初始内存使用量
    for col in df.columns: # 遍历DataFrame的每一列
        col_type = df[col].dtypes # 获取该列的数据类型
        if col_type in numerics: # 如果该列是数值类型
            c_min = df[col].min() # 获取该列的最小值
            c_max = df[col].max() # 获取该列的最大值
            if str(col_type)[:3] == 'int': # 如果该列是整数类型
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max: # 如果该列的数值范围在int8的范围内
                    df[col] = df[col].astype(np.int8) # 将该列的数据类型转换为int8
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max: # 如果该列的数值范围在int16的范围内
                    df[col] = df[col].astype(np.int16) # 将该列的数据类型转换为int16
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max: # 如果该列的数值范围在int32的范围内
                    df[col] = df[col].astype(np.int32) # 将该列的数据类型转换为int32
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max: # 如果该列的数值范围在int64的范围内
                    df[col] = df[col].astype(np.int64) # 将该列的数据类型转换为int64  
            else: # 如果该列不是整数类型
                if c_min > np.finfo(np.float16).min and c_max < np.finfo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值