iFLYTEK2022糖尿病遗传风险检测挑战赛暨LightGBM模型

一、赛题描述

赛题:糖尿病遗传风险检测挑战赛
主办方:中国信息协会区块链分会
主页:https://challenge.xfyun.cn/topic/info?type=diabetes&option=ssgy

背景

截至2022年,中国糖尿病患者近1.3亿。中国糖尿病患病原因受生活方式、老龄化、城市化、家族遗传等多种因素影响。同时,糖尿病患者趋向年轻化。

糖尿病可导致心血管、肾脏、脑血管并发症的发生。因此,准确诊断出患有糖尿病个体具有非常重要的临床意义。糖尿病早期遗传风险预测将有助于预防糖尿病的发生。

根据《中国2型糖尿病防治指南(2017年版)》,糖尿病的诊断标准是具有典型糖尿病症状(烦渴多饮、多尿、多食、不明原因的体重下降)且随机静脉血浆葡萄糖≥11.1mmol/L或空腹静脉血浆葡萄糖≥7.0mmol/L或口服葡萄糖耐量试验(OGTT)负荷后2h血浆葡萄糖≥11.1mmol/L。

在这次比赛中,您需要通过训练数据集构建糖尿病遗传风险预测模型,然后预测出测试数据集中个体是否患有糖尿病,和我们一起帮助糖尿病患者解决这“甜蜜的烦恼”。

任务

本次比赛中,预测模型的结果文件需要命名成:预测结果.csv,然后提交。

二、数据集说明

编号:标识个体身份的数字;

性别:1表示男性,0表示女性;

出生年份:出生的年份;

体重指数:体重除以身高的平方,单位kg/m2;

糖尿病家族史:标识糖尿病的遗传特性,记录家族里面患有糖尿病的家属,分成三种标识,分别是父母有一方患有糖尿病、叔叔或者姑姑有一方患有糖尿病、无记录;

舒张压:心脏舒张时,动脉血管弹性回缩时,产生的压力称为舒张压,单位mmHg;

口服耐糖量测试:诊断糖尿病的一种实验室检查方法。比赛数据采用120分钟耐糖测试后的血糖值,单位mmol/L;

胰岛素释放实验:空腹时定量口服葡萄糖刺激胰岛β细胞释放胰岛素。比赛数据采用服糖后120分钟的血浆胰岛素水平,单位pmol/L;

肱三头肌皮褶厚度:在右上臂后面肩峰与鹰嘴连线的重点处,夹取与上肢长轴平行的皮褶,纵向测量,单位mm;

患有糖尿病标识:数据标签,1表示患有糖尿病,0表示未患有糖尿病。

训练集说明

训练集(比赛训练集.csv)一共有5070条数据,用于构建您的预测模型(您可能需要先进行数据分析)。数据的字段有编号、性别、出生年份、体重指数、糖尿病家族史、舒张压、口服耐糖量测试、胰岛素释放实验、肱三头肌皮褶厚度、患有糖尿病标识(最后一列),您也可以通过特征工程技术构建新的特征。

测试集说明

测试集(比赛测试集.csv)一共有1000条数据,用于验证预测模型的性能。数据的字段有编号、性别、出生年份、体重指数、糖尿病家族史、舒张压、口服耐糖量测试、胰岛素释放实验、肱三头肌皮褶厚度。

数据集版权许可协议

BY-NC-SA 4.0
https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans

三、解决方案样例

导入相关系统库

import pandas as pd
import lightgbm

【本样例运行环境的关键版本信息】

python 3.12.3

lightgbm 3.3.0

读入数据集

data1 = pd.read_csv('./data/比赛训练集.csv', encoding='gbk')
data2 = pd.read_csv('./data/比赛测试集.csv', encoding='gbk')

特征工程

# 成人体重指数正常值是在18.5-24之间
# 低于18.5是体重指数过轻,在24-27之间是体重超重,27以上是肥胖,高于32就是非常肥胖
def BMI(a):
    if a<18.5:
        return 0
    elif 18.5<=a<=24:
        return 1
    elif 24<a<=27:
        return 2
    elif 27<a<=32:
        return 3
    else:
        return 4

data['BMI'] = data['体重指数'].apply(BMI)
data['年龄'] = 2022 - data['出生年份']

创建并训练 LightGBM 模型

def select_by_lgb(train_data, train_label, test_data, random_state=2022, metric='auc', num_round=300):
    clf = lightgbm
    train_matrix = clf.Dataset(train_data, label=train_label)

    params = {
            'boosting_type': 'gbdt',  
            'objective': 'binary',
            'learning_rate': 0.1,
            'metric': metric,
            'seed': 2020,
            'nthread': -1 }
    model = clf.train(params, train_matrix, num_round)
    pre_y = model.predict(test_data)
    return pre_y

test_data = select_by_lgb(train, train_label, test)
pre_y = pd.DataFrame(test_data)
pre_y['label'] = pre_y[0].apply(lambda x:1 if x>0.5 else 0)

输出预测结果

result = pd.read_csv('./data/提交示例.csv')
result['label'] = pre_y['label']
result.to_csv('预测结果.csv', index=False)

源码开源协议

GPL-v3
https://zhuanlan.zhihu.com/p/608456168

四、获取案例套件

需要登录后才允许下载文件包。登录

发表评论