type
status
date
slug
summary
tags
password
category
Property
Jan 30, 2024 11:52 AM
icon
赛题解析与解题思路
首届世界科学智能大赛:生命科学赛道——生物学年龄评价与年龄相关疾病风险预测:
https://tianchi.aliyun.com/s/6a1351ecd2a3987995a7bda7f62542d2
举办方:阿里云天池
赛题背景
生物学年龄评价是一种通过测量和分析生物体内特定指标或生理过程的状态,以评估个体的生理年龄和健康状况的方法。与传统的日历年龄相比,生物学年龄可以提供更准确的健康评估和疾病风险预测。随着 AI 技术的不断发展,计算科学与生命科学的整合与发展将为健康管理应用开发、衰老机制研究、抗衰老药物研发提供前沿的思路与方法。基于上述背景,我们举办基于甲基化测量数据预测生物学年龄的比赛。
这项比赛将结合计算科学和生命科学的发展,为健康管理应用的开发、衰老机制的研究以及抗衰老药物的研发提供前沿的思路和方法。传统的日历年龄只提供了时间上的度量,而生物学年龄则更加关注个体的生理状态和功能。通过测量和分析生物体内的特定指标或生理过程的状态,我们能够更准确地评估个体的生理年龄和健康状况,这对于健康管理和疾病风险预测至关重要。参赛者可以利用甲基化测量数据来预测生物学年龄。本次比赛将为研究人员和开发人员提供机会,合作解决生物学年龄评估中的挑战,并推动相关领域的进步。最终的目标是提供更精确、可靠和个性化的生物学年龄评估工具,为人们的健康管理和抗衰老策略提供有力支持。
赛事任务
本次比赛提供健康人和年龄相关疾病患者的甲基化数据,期待选手通过分析甲基化数据的模式和特征建立预测模型,可以根据某个人的甲基化数据来预测其生物学年龄。
赛题数据集
公开数据包含10296个样本,其中7833个样本为健康样本。每一个样本提供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)进行计算,取平均得到最终分数。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9a0c0f71-e346-440f-82d0-288ac1c14bbd%2FUntitled.png?table=block&id=4de2c0b7-eafe-42c6-ace0-7785f97a23e9&t=4de2c0b7-eafe-42c6-ace0-7785f97a23e9&width=1280&cache=v2)
解题思路
本题初赛任务是预测样本年龄,属于典型的回归问题,输入数据为每一个样本对应的485512个位点的甲基化数据与患病情况,输出为样本对应年龄。
可以看到所提供的特征纬度非常高(485512维),可以考虑基本的特征选择,比如考虑覆盖率、相关性、特征重要性等。或者仅使用部分特征,快速跑通流程,后续在考虑如何添加更多特征,也是一个不错的选择。
模型方面可以选择机器学习模型或深度学习模型,如果使用类似xgboost这类机器学习模型,是不需要进行缺失值填充和数据标准化操作的,效果比较稳定。如果选择深度学习模型,则要进行缺失值填充和数据标准化操作,网络搭建也需要更多的尝试。
鉴于上面的对比,我们Baseline选择使用机器学习方法,在解决机器学习问题时,一般会遵循以下流程:
暂时
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd63ba435-51ed-45fa-ab97-c1e365fbbe1d%2FUntitled.png?table=block&id=1dc35eff-4372-440f-8550-b36c878b89f6&t=1dc35eff-4372-440f-8550-b36c878b89f6&width=2588&cache=v2)
Baseline实践
刚刚我们完成了基本的问题分析,接下来会带领大家跑通数据探索、数据清洗、特征工程、模型训练、模型验证、结果输出的全部竞赛实践流程。
任务1:云环境配置与数据下载
介于本赛事的数据规模比较庞大,推荐大家使用赛事官方推荐的阿里云的云环境,提供免费V100与A10算力,可以快速跑通全流程
DSW环境配置与Baseline视频讲解,@李娇娇 助教贡献
以下代码全部更新,补充了代码逐行解析@刘志文 助教贡献
任务2:精读Baseline
导入模块
导入我们本次Baseline代码所需的模块
数据探索
数据探索性分析,是通过了解数据集,了解变量间的相互关系以及变量与预测值之间的关系,对已有数据在尽量少的先验假设下通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法,从而帮助我们后期更好地进行特征工程和建立模型,是机器学习中十分重要的一步。
加载数据及基本的预处理,需要特别注意:
训练集压缩包7.22G,测试集压缩包2.01G
解压缩后
traindata.csv
56.7G,testdata.csv
压缩包14.2G本地算力不够的同学,推荐使用赛事云端环境PAI-DSW
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fea7af200-3070-4b91-9940-6f03c36ce774%2FUntitled.png?table=block&id=f877c077-6b4f-42f7-a558-67dda84b15f5&t=f877c077-6b4f-42f7-a558-67dda84b15f5&width=1280&cache=v2)
1、使用reduce_mem_usage_pl函数对数据进行类型转换,及时减少内存;下面代码中使用压缩函数,内存可以压缩一半;
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9d4c4155-b228-4c71-9610-51ae81290b19%2FUntitled.png?table=block&id=72a7df99-aa05-44c0-91f9-c588d21ae535&t=72a7df99-aa05-44c0-91f9-c588d21ae535&width=648&cache=v2)
2、对数据进行预处理,主要是进行数据表的转置操作,因为原本数据为每一列代表一个样本,需要调整为每一行为一个样本;
3、处理完的数据然后保存为pickle文件,之后使用数据时可以直接加载pickle文件即可,减少重复预处理工作。
基本信息展示
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffb8883d2-8b34-4c67-8e38-24703aca3618%2FUntitled.png?table=block&id=2b02231d-50ce-4c5a-bc7a-77a9fa3abf7a&t=2b02231d-50ce-4c5a-bc7a-77a9fa3abf7a&width=960&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5006d1e5-2cc7-46b5-b6ac-49b019678d65%2FUntitled.png?table=block&id=fb7c13da-2f01-41f1-ba87-a68b75f166e2&t=fb7c13da-2f01-41f1-ba87-a68b75f166e2&width=1280&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fae892426-dc3c-4c9e-9978-a04fac1dab69%2FUntitled.png?table=block&id=d4f2aa6b-daf2-44e4-b58c-d15c796b98fe&t=d4f2aa6b-daf2-44e4-b58c-d15c796b98fe&width=630&cache=v2)
经过上面简单的信息展示,可以发现trainmap中的gender、sample_type、disease为字符串类型的特征,需要进行转换为数值类型。traindata数据已经调整为每行代表一个样本的结构,每列表示一个特征。
下面展示部分特征字段地缺失比例,可以看出部分特征缺失率还是蛮高的。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fec70828b-1293-440f-818c-b2db5386c388%2FUntitled.png?table=block&id=0ca42e13-1d64-490f-8d33-590e5b6f97e8&t=0ca42e13-1d64-490f-8d33-590e5b6f97e8&width=546&cache=v2)
下面使用DataFrame自带的corr()方法展示前1000个特征之间的相关性分数,大于0为正相关,小于0为负相关。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F71c8506a-0049-4a76-a669-c0e895011ce3%2FUntitled.png?table=block&id=9db40a2f-9fc8-4716-bf33-140bd0a01064&t=9db40a2f-9fc8-4716-bf33-140bd0a01064&width=1280&cache=v2)
数据清洗
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。俗话说:garbage in, garbage out。分析完数据后,特征工程前,必不可少的步骤是对数据清洗。
数据清洗的作用是利用有关技术如数理统计、数据挖掘或预定义的清理规则将脏数据转化为满足数据质量要求的数据。主要包括缺失值处理、异常值处理、数据分桶、特征归一化/标准化等流程。
经过数据探索部分的分析,需要进行处理的部分包括缺失值、数据类型转换,其中对于缺失值的处理,鉴于baseline方案使用的是catboost模型,并不需要进行缺失值处理。
下面仅需要进行数据类型的转换操作:
特征工程
特征工程指的是把原始数据转变为模型训练数据的过程,目的是获取更好的训练数据特征。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。
原始字段特征以连续型数值为主,可以按行进行聚合统计操作,如构建max、min、mean、std、skew等常见的数值统计特征。
模型训练与验证
特征工程也好,数据清洗也罢,都是为最终的模型来服务的,模型的建立和调参决定了最终的结果。模型的选择决定结果的上限, 如何更好的去达到模型上限取决于模型的调参。
建模的过程需要我们对常见的线性模型、非线性模型有基础的了解。模型构建完成后,需要掌握一定的模型性能验证的方法和技巧
作为baseline方案使用catboost模型,并选择经典的K折交叉验证方法进行离线评估,大体流程如下:
1、K折交叉验证会把样本数据随机的分成K份;
2、每次随机的选择K-1份作为训练集,剩下的1份做验证集;
3、当这一轮完成后,重新随机选择K-1份来训练数据;
4、最后将K折预测结果取平均作为最终提交结果。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4889921e-b6fd-4795-b1b2-3b726692e200%2FUntitled.png?table=block&id=886103dc-e863-42b2-996b-8c634130db31&t=886103dc-e863-42b2-996b-8c634130db31&width=1280&cache=v2)
具体代码如下:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4fa1614b-9402-468c-a4b4-6882d88e3cf4%2FUntitled.png?table=block&id=03dcf4ee-9159-46d5-9e2e-8ea9b20150ac&t=03dcf4ee-9159-46d5-9e2e-8ea9b20150ac&width=1280&cache=v2)
特征重要性结果展示:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5fd792bb-7919-4294-adaf-824eaaf1e073%2FUntitled.png?table=block&id=3c4b6098-6186-4c6f-918b-f497e398def3&t=3c4b6098-6186-4c6f-918b-f497e398def3&width=706&cache=v2)
细致的观察特征重要性排序,我们手动构建的max、min、mean这类特征并没有排到前面,这也大概率说明这类特征可能没有太多作用。
结果输出
提交需要符合提交样例结果,线上提交分数3.8840,能优化的空间还是非常大的。
nrow:读取数据行数,iterations:模型迭代次数,阿里云PAI-DSW提供的最高配免费算力V100
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8a21fac4-3ec5-4ad2-895a-144f31a15755%2FUntitled.png?table=block&id=1ab0d94f-179c-49ef-9f0e-85c811a9aa50&t=1ab0d94f-179c-49ef-9f0e-85c811a9aa50&width=1280&cache=v2)
完整代码
任务3:进阶实践
在进阶实践部分,将在原有Baseline基础上做更多优化,一般优化思路,从特征工程与模型中来思考。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4c3b2c5f-5407-426e-80b0-20af56303609%2FUntitled.png?table=block&id=83414c5c-125e-4a74-b4b9-01930b2ea9d9&t=83414c5c-125e-4a74-b4b9-01930b2ea9d9&width=2672&cache=v2)
优化方法建议:
- 读取所有特征:因为特征字段过大,所以baseline仅使用部分特征,不免导致很多数据信息丢失,可以加载所有原始特征并进行特征筛选进行优化。
- 提取更多特征:在数据挖掘比赛中,特征总是最终制胜法宝,去思考什么信息可以帮助我们提高预测精准度,然后将其转化为特征输入到模型。
- 尝试不同的模型:模型间存在很大的差异,预测结果也会不一样,比赛的过程就是不断的实验和试错的过程,通过不断的实验寻找最佳模型,同时帮助自身加强模型的理解能力。
特征优化
1、原始特征进行特征选择,过滤熟悉唯一、缺失率过高、高相关特征;
2、提取PCA、LDA、SVD这类降维特征。因为特征纬度过大,读取全部特征或者直接使用全部特征训练要求很大的内存,可以将数据逐组进行降维操作,比如将特征分10组,每组进行PCA、LDA、SVD操作,然后将10组降维后的结果合并起来作为入模特征。
特征选择参考代码如下:
特征提取参考代码如下:
模型融合
进行模型融合的前提是有多个模型的输出结果,比如使用catboost、xgboost和lightgbm三个模型分别输出三个结果,这时就可以将三个结果进行融合,最常见的是将结果直接进行加权平均融合。
下面我们构建了cv_model函数,内部可以选择使用lightgbm、xgboost和catboost模型,可以依次跑完这三个模型,然后将三个模型的结果进行取平均进行融合。
另外一种就是stacking融合,stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2ac65f50-6dc5-4c24-be2b-6563a092f8f7%2FUntitled.png?table=block&id=e2f66261-640f-465b-bbf5-09b137518d93&t=e2f66261-640f-465b-bbf5-09b137518d93&width=1280&cache=v2)
第一层:(类比cv_model函数)
- 划分训练数据为K折(5折为例,每次选择其中四份作为训练集,一份作为验证集);
- 针对各个模型RF、ET、GBDT、XGB,分别进行5次训练,每次训练保留一份样本用作训练时的验证,训练完成后分别对Validation set,Test set进行预测,对于Test set一个模型会对应5个预测结果,将这5个结果取平均;对于Validation set一个模型经过5次交叉验证后,所有验证集数据都含有一个标签。此步骤结束后:5个验证集(总数相当于训练集全部)在每个模型下分别有一个预测标签,每行数据共有4个标签(4个算法模型),测试集每行数据也拥有四个标签(4个模型分别预测得到的)
第二层:(类比stack_model函数)
- 将训练集中的四个标签外加真实标签当作五列新的特征作为新的训练集,选取一个训练模型,根据新的训练集进行训练,然后应用测试集的四个标签组成的测试集进行预测作为最终的result。
Stacking参考代码:
完整代码
附录
QA文档
实践环境配置
AI环境配置:
- 图文材料:https://gitee.com/anine09/learn-python-the-smart-way-v2/blob/main/slides/chapter_0-Installation.ipynb
工具使用与提分思路
- 竞赛实践路线:竞赛实践路线分享
- 机器学习特征工程实用技巧大全:https://zhuanlan.zhihu.com/p/67832773
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe90c9bf5-c89d-491d-af3b-579a0490dce0%2FUntitled.png?table=block&id=7f8d03ef-7eb3-4c82-a708-5b413e9acdd6&t=7f8d03ef-7eb3-4c82-a708-5b413e9acdd6&width=1280&cache=v2)