【数据挖掘竞赛】——糖尿病遗传风险检测挑战赛(科大讯飞)

🤵‍♂️ 个人主页:@Lingxw_w的个人主页

✍🏻作者简介:计算机科学与技术研究生在读
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+  

2022 iFLYTEK A.I.开发者大赛-讯飞开放平台

目录

2022 iFLYTEK A.I.开发者大赛-讯飞开放平台

一、赛事背景

二、赛事任务

2.1 数据集字段说明

2.2 训练集说明

2.3 测试集说明

三、提交说明

四、评估指标

五、数据分析

5.1导入数据

5.2查看训练集和测试集字段类型

5.3统计字段的缺失值

5.4分析字段类型

5.5字段相关性

六、逻辑回归尝试

6.1导入sklearn的逻辑回归

6.2使用训练集和逻辑回归进行训练,并在测试集上进行预测;

         6.3提交结果

6.4尝试决策树模型

七、特征工程

 7.1统计每个性别对应的[体重指数]、[舒张压]平均值

 7.2计算每个患者与每个性别平均值的差异

八、高阶树模型

8.1安装lightgbm

8.2将训练集20%划分为验证集,使用LightGBM完成训练

九、多折训练与集成


一、赛事背景

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

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

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

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

二、赛事任务

2.1 数据集字段说明

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

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

出生年份:出生的年份;

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

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

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

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

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

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

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

2.2 训练集说明

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

2.3 测试集说明

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

三、提交说明

对于测试数据集当中的个体,您必须预测其是否患有糖尿病(患有糖尿病:1,未患有糖尿病:0),预测值只能是整数1或者0。提交的数据应该具有如下格式:

uuid,label

1,0

2,1

3,1

...

本次比赛中,预测模型的结果文件需要命名成:预测结果.csv,然后提交。请确保您提交的文件格式规范。

四、评估指标

对于提交的结果,系统会采用二分类任务中的F1-score指标进行评价,F1-score越大说明预测模型性能越好,F1-score的定义如下:

其中:

五、数据分析

5.1导入数据

  • 解压比赛数据,并使用pandas进行读取;
import pandas as pdtrain_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
test_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')print(train_df.shape, test_df.shape)
print(train_df.dtypes, test_df.dtypes)

5.2查看训练集和测试集字段类型

5.3统计字段的缺失值

train_df.isnull().sum()
编号            0
性别            0
出生年份          0
体重指数          0
糖尿病家族史        0
舒张压         247
口服耐糖量测试       0
胰岛素释放实验       0
肱三头肌皮褶厚度      0
患有糖尿病标识       0
dtype: int64
test_df.isnull().sum()
编号           0
性别           0
出生年份         0
体重指数         0
糖尿病家族史       0
舒张压         49
口服耐糖量测试      0
胰岛素释放实验      0
肱三头肌皮褶厚度     0
dtype: int64

训练集和测试集各列缺失比例计算

 唯一包含缺失值的是舒张压这一列,且缺失值占比不大。

但是明显的发现训练集中:

口服耐糖量测试为-1的也属于缺失值,胰岛素释放实验为0的也属于缺失值,肱三头肌厚度为0的也属于缺失值,待后面在处理。

 5.4分析字段类型

截图来自阿水。

训练集和测试集描述

 5.5字段相关性

import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['FangSong']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# 训练集相关性热力图矩阵
plt.subplots(figsize=(10,10))
sns.heatmap(train_df.corr(method='pearson'), annot=True, vmax=1, square=True, cmap='YlGnBu')
plt.savefig('train_pearson.jpg', dpi=800)

如何画热力图: http://t.csdn.cn/FQIro

# 测试集相关性热力图矩阵
plt.subplots(figsize=(10,10))
sns.heatmap(test_df.corr(method='pearson'), annot=True, vmax=1, square=True, cmap='YlGnBu')
plt.savefig('test_pearson.jpg', dpi=800)

 从热力图可以看出,训练集中体重指数肱三头肌皮褶厚度与标签的相关性相对较高,肱三头肌皮褶厚度与标签的相关性最高。各字段之间的相关性普遍不高。

六、逻辑回归尝试

6.1导入sklearn的逻辑回归

# 构建逻辑回归模型
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline
# 构建逻辑回归模型
model = make_pipeline(MinMaxScaler(),LogisticRegression()
)
model.fit(train_dataset,train_data["患有糖尿病标识"])

6.2使用训练集和逻辑回归进行训练,并在测试集上进行预测;

test_dataset["label"] = model.predict(test_dataset.drop(["编号"],axis=1))
test_dataset.rename({"编号":'uuid'},axis=1)[['uuid','label']].to_csv("submit_lr.csv",index=None)

6.3提交结果

6.4尝试决策树模型

# 尝试构建决策树模型
model = make_pipeline(MinMaxScaler(),DecisionTreeClassifier())
model.fit(train_dataset,train_data["患有糖尿病标识"])
test_dataset["label"] = model.predict(test_dataset.drop(["编号",'label'],axis=1))
test_dataset.rename({"编号":'uuid'},axis=1)[['uuid','label']].to_csv("submit_dt.csv",index=None)

结果:

七、特征工程

7.1统计每个性别对应的[体重指数]、[舒张压]平均值

train_dataset.groupby("性别")["体重指数"].apply(np.mean)

 7.2计算每个患者与每个性别平均值的差异

"""
人体的成人体重指数正常值是在18.5-24之间
低于18.5是体重指数过轻
在24-27之间是体重超重
27以上考虑是肥胖
高于32了就是非常的肥胖。
"""
def BMI(a):if a<18.5:return 0elif 18.5<=a<=24:return 1elif 24<a<=27:return 2elif 27<a<=32:return 3else:return 4data['BMI']=data['体重指数'].apply(BMI)
data['出生年份']=2022-data['出生年份']  #换成年龄
#糖尿病家族史
"""
无记录
叔叔或者姑姑有一方患有糖尿病/叔叔或姑姑有一方患有糖尿病
父母有一方患有糖尿病
"""
def FHOD(a):if a=='无记录':return 0elif a=='叔叔或者姑姑有一方患有糖尿病' or a=='叔叔或姑姑有一方患有糖尿病':return 1else:return 2data['糖尿病家族史']=data['糖尿病家族史'].apply(FHOD)
data['舒张压']=data['舒张压'].fillna(-1)
"""
舒张压范围为60-90
"""
def DBP(a):if a<60:return 0elif 60<=a<=90:return 1elif a>90:return 2else:return a
data['DBP']=data['舒张压'].apply(DBP)
data

八、高阶树模型

8.1安装lightgbm

import lightgbm as lgb
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

8.2将训练集20%划分为验证集,使用LightGBM完成训练

train_data = pd.read_csv("比赛训练集.csv",encoding='gbk')
test_data = pd.read_csv("比赛测试集.csv",encoding='gbk')train_data = pd.get_dummies(train_data)
test_data = pd.get_dummies(test_data)
# 划分数据集
train_x,valid_x = train_test_split(train_data,test_size=0.2)
clf_lgb = lgb.LGBMClassifier(max_depth=3, n_estimators=4000, n_jobs=-1, verbose=-1,verbosity=-1,learning_rate=0.1,
)
clf_lgb.fit(train_x.drop(["患有糖尿病标识"],axis=1),train_x["患有糖尿病标识"])
predicts = clf_lgb.predict(valid_x.drop(["患有糖尿病标识"],axis=1))
print(accuracy_score(valid_x["患有糖尿病标识"], predicts))
[LightGBM] [Warning] verbosity is set=-1, verbose=-1 will be ignored. Current value: verbosity=-1
0.9546351084812623
# 搜索参数
kfold = StratifiedKFold(n_splits=5,shuffle=True,random_state=2022)
classifier = lgb.LGBMClassifier()
params = {" max_depth":[4,5,6],"n_estimators":[3000,4000,5000],"learning_rate":[0.15,0.2,0.25]
}
clf  = GridSearchCV(estimator=classifier,param_grid=params,verbose=True,cv=kfold)
clf.fit(train_x.drop(["患有糖尿病标识"],axis=1),train_x["患有糖尿病标识"])
predicts1 = clf.best_estimator_.predict(valid_x.drop(["患有糖尿病标识"],axis=1))
print(accuracy_score(valid_x["患有糖尿病标识"], predicts1))

九、多折训练与集成

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.model_selection import KFold
import lightgbm as lgb# 读取数据
train_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
test_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')# 基础特征工程
train_df['体重指数_round'] = train_df['体重指数'] // 10
test_df['体重指数_round'] = train_df['体重指数'] // 10train_df['口服耐糖量测试'] = train_df['口服耐糖量测试'].replace(-1, np.nan)
test_df['口服耐糖量测试'] = test_df['口服耐糖量测试'].replace(-1, np.nan)dict_糖尿病家族史 = {'无记录': 0,'叔叔或姑姑有一方患有糖尿病': 1,'叔叔或者姑姑有一方患有糖尿病': 1,'父母有一方患有糖尿病': 2
}train_df['糖尿病家族史'] = train_df['糖尿病家族史'].map(dict_糖尿病家族史)
test_df['糖尿病家族史'] = test_df['糖尿病家族史'].map(dict_糖尿病家族史)train_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')
test_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')train_df['性别'] = train_df['性别'].astype('category')
test_df['性别'] = train_df['性别'].astype('category')train_df['年龄'] = 2022 - train_df['出生年份']
test_df['年龄'] = 2022 - test_df['出生年份']train_df['口服耐糖量测试_diff'] = train_df['口服耐糖量测试'] - train_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']
test_df['口服耐糖量测试_diff'] = test_df['口服耐糖量测试'] - test_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']# 模型交叉验证
def run_model_cv(model, kf, X_tr, y, X_te, cate_col=None):train_pred = np.zeros( (len(X_tr), len(np.unique(y))) )test_pred = np.zeros( (len(X_te), len(np.unique(y))) )cv_clf = []for tr_idx, val_idx in kf.split(X_tr, y):x_tr = X_tr.iloc[tr_idx]; y_tr = y.iloc[tr_idx]x_val = X_tr.iloc[val_idx]; y_val = y.iloc[val_idx]call_back = [lgb.early_stopping(50),]eval_set = [(x_val, y_val)]model.fit(x_tr, y_tr, eval_set=eval_set, callbacks=call_back, verbose=-1)cv_clf.append(model)train_pred[val_idx] = model.predict_proba(x_val)test_pred += model.predict_proba(X_te)test_pred /= kf.n_splitsreturn train_pred, test_pred, cv_clfclf = lgb.LGBMClassifier(max_depth=3, n_estimators=4000, n_jobs=-1, verbose=-1,verbosity=-1,learning_rate=0.1,
)train_pred, test_pred, cv_clf = run_model_cv(clf, KFold(n_splits=5),train_df.drop(['编号', '患有糖尿病标识'], axis=1),train_df['患有糖尿病标识'],test_df.drop(['编号'], axis=1),
)print((train_pred.argmax(1) == train_df['患有糖尿病标识']).mean())
test_df['label'] = test_pred.argmax(1)
test_df.rename({'编号': 'uuid'}, axis=1)[['uuid', 'label']].to_csv('submit.csv', index=None)

 

第一次参加数据挖掘的竞赛,很多地方借鉴大佬的,学到了很多,下次努力。

 其他数据挖掘实战案例: [订阅链接]

【数据挖掘实战】——航空公司客户价值分析(K-Means聚类案例)

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)

【数据挖掘实战】——应用系统负载分析与容量预测(ARIMA模型)

【数据挖掘实战】——电力窃漏电用户自动识别(LM神经网络和决策树)

【数据挖掘实战】——基于水色图像的水质评价(LM神经网络和决策树)

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

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

相关文章

【开源】23个优秀的机器学习数据集

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 作者 | Nikola M. Zivkovic 译者 | 王强 策划 | 凌敏 本文最初发布于 rubikscode.com 网站&#xff0c;经原作者授权由 InfoQ 中文站翻译并分享。 Iris 数据集的那些示例…

数据分析也能造假!你得小心这些不为人知的坑

数据分析看似科学理性&#xff0c;但是只要是人参与的工作&#xff0c;就没有不能造假的&#xff0c;尤其是类似数据分析这种工作&#xff0c;很容易产生诡辩论&#xff0c;我们需要实时擦亮眼睛&#xff01; 作为一个小头目&#xff0c;经常会读到来自各种团队的数据分析报告&…

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

数据挖掘--(实验二)关联规则实验

实验一 有趣的频繁项集 案例简介&#xff1a; 有时我们并不想寻找所有频繁项集,而只对包含某个特定元素项 的项集感兴趣。我们会寻找毒蘑菇中的一些公共特征,利用这些特征 就能避免吃到那些有毒的蘑菇。UCI 的机器学习数据集合中有一个关于肋形蘑菇的 23 种特征的数据集,每一…

数据挖掘--糖尿病遗传风险检测

文章目录 赛事背景数据特征介绍数据处理导入数据并查看分析数据数据清洗特征工程 构建模型建立训练数据集和测试数据集构建模型 赛事背景 截至2022年&#xff0c;中国糖尿病患者近1.3亿。中国糖尿病患病原因受生活方式、老龄化、城市化、家族遗传等多种因素影响。同时&#xff…

【数据分析】业务分析之ABtest

A/B测试 AB测试是为Web或App界面或流程制作两个&#xff08;A/B&#xff09;或多个&#xff08;A/B/n&#xff09;版本&#xff0c;在同一时间维度&#xff0c;分别让组成成分相同&#xff08;相似&#xff09;的访客群组&#xff08;目标人群&#xff09;随机的访问这些版本&a…

生物信息学竞赛:糖尿病数据挖掘

糖尿病数据挖掘 一理&#xff1a;机器学习量化分析糖尿病致病因子下载&#xff1a;临床数据线性回归预测糖尿病LightGBM 预测糖尿病糖尿病因子分析变量相关性分析 一文&#xff1a;当前科学理解慢病之王的解决方案是什么怎么治疗怎么预防 一理&#xff1a;机器学习量化分析糖尿…

VS Code插件之Debugger for Chrome

号称2018最火的编辑器&#xff0c;不用用怎么行&#xff1f; 不多说直接开始踩坑之路。 要在vs中启动chrome控制台怎么办&#xff1f;vscode并没有集成环境&#xff0c;这里我们需要借助一个插件Debugger for Chrome。 选择左边安装包选项&#xff0c;点击商店搜索Debugger for…

Vscode对C/C++可视化的代码跟踪调试

文章目录 可视化的代码跟踪调试1、安装Visual Studio Code2、用vscode编译调试C\C 总结 可视化的代码跟踪调试 ubantu18.04的环境下&#xff0c;在命令行工具gdb调试基础上&#xff0c;利用可视化调试前端软件Visual Studio Code&#xff0c;&#xff08;后端依然依赖gcc、gdb…

VS Code真机测试步骤

VS Code真机测试步骤 前提&#xff1a;你的电脑跟你的手机是在同一个网络环境下。电脑连手机热点&#xff1b; 1&#xff0e; 在扩展里搜索live server&#xff0c;下载安装&#xff1b; 2&#xff0e; 打开cmd 命令窗口&#xff08;快捷键是winr&#xff09;&#xff1b; 输入…

VS Code调试C代码

1、前言 首先说明的是vscode是代码编辑器&#xff0c;并不是编译器&#xff0c;它本身并不能编译C语言。 在这里我们使用的是MinGW-w64作为C语言的编译器。MinGW-w64的前身是MinGW的全称是&#xff1a;Minimalist GNU on Windows。它实际上是将经典的开源 C语言 编译器 GCC 移…

VScode的代码截图插件CodeSnap

CodeSnap : 在 VS Code 中为您的代码截取漂亮的屏幕截图&#xff01; 插件名&#xff1a;CodeSnap官方地址&#xff1a;CodeSnap - Visual Studio Marketplace特征&#xff1a; 快速保存代码的屏幕截图将屏幕截图复制到剪贴板显示行号许多其他配置选项用法&#xff1a;选中需要…

Vscode——调试数据可视化插件debug-visualizer

debug-visualizer是一款极其优秀的调试数据可视化插件 安装方法 第一步&#xff1a;vscode插件库安装 debug-visualizer第二步&#xff1a;环境内输入 pip install vscodedebugvisualizer 使用方法 启动调试Ctrl Shift P 打开命令面板&#xff0c;输入 Debug Visualizer: …

VS Code 最好的 Git 可视化插件

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 作者丨小集 来源丨小集&#xff08;ID&#xff1a;zsxjtip&#xff09; Visual Studio Code 有几组 git 命令来为您的代码存储库执行和执行多项任务。但是&#xff0…

如何使用VScode软件测试接口

我们知道&#xff0c;Visual Studio Code&#xff08;简称VScode&#xff09;软件一般用于编写前端代码&#xff0c;但其实&#xff0c;它也可以很方便的用于接口测试&#xff0c;达到和postMan一样的效果。 怎么实现呢&#xff1f; 步骤如下&#xff1a; 1.安装 REST Clien…

视频特效软件有哪些?这些软件值得一试

大家平常在制作视频时&#xff0c;经常需要将多个视频拼接&#xff0c;但是如果两个视频中间没有什么转场过渡的话&#xff0c;会显得很单调。我们可以增加一些转场、音乐、特效&#xff0c;这样整支视频看起来效果会好很多。讲到视频特效&#xff0c;可能有些小伙伴会觉得它很…

python :超级大乐透

体育彩票 超级大乐透 dlt.py # codingutf-8 import randomdef xuanhao(total, count):element [x1 for x in range(total)]result []for i in range(count):res element[random.randint(0, len(element)-1)]element.remove(res)result.append(res)return result# 超级大乐透…

发卡网源码

简介&#xff1a;发卡网带代理功能&#xff0c;安装简单。 网盘地址&#xff1a;https://pan.baidu.com/s/1E3AtqCmBZPjXgaiUEXrM6Q 提取码:rsu4 展示&#xff1a;

最新鲸发卡企业发卡网系统源码+免授权

正文: 心心念念的鲸发卡来啦&#xff0c;企业发卡源码&#xff0c;鲸发卡。目前全网最稳定的发卡系统之一。 在运营版本&#xff0c;既然做就要把他当作一项事业来做。 程序开源无加密&#xff0c;完整运营级程序&#xff0c;非市面上垃圾程序BUG一堆。 此程序经过市场验证…

功能强大的发卡网源码+支付接口超多

正文: 有二十三个支付接口&#xff0c;三套前台模板。 由于还得更新其他源码&#xff0c;就填充了一个商品&#xff0c;UI看起来不错&#xff0c;脑补了下&#xff0c; 填充完商品后&#xff0c;应该会更好看。 程序: wwbwf.lanzouf.com/iigbh09ygu6b 图片: