Datawhale干货

作者:牧小熊,Datawhale成员

上周在Datawhale分享了一篇关于数据挖掘赛事的baseline方案,有老师把它作为学习资料给学生实践学习后,有挺多同学反应学习实践中仍然有困难:

同学A:baseline有些代码看不懂

同学B:刚刚开始学,想入门学习,不知道从哪个地方下手,然后理论也不是很扎实,不知道先学理论还是先下手;看到了方案,不知道运用哪些知识,还是挺糊涂的;

同学C:面向初学者入门需要细致全面一点,比如包括文件读入、特征处理、输入输出数据结构的定义、初步得到结果、是否有值得优化的地方……等等

所以我重新写了一篇,面向参赛实践中的初学者:提供了赛事实践的完整流程、完整的代码注释、以及参考学习资料。

赛题介绍

科大讯飞:糖尿病遗传风险检测挑战赛。截至2022年,中国糖尿病患者近1.3亿。中国糖尿病患病原因受生活方式、老龄化、城市化、家族遗传等多种因素影响。同时,糖尿病患者趋向年轻化。

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

赛事实践地址

https://challenge.xfyun.cn/topic/info?type=diabetes&ch=ds22-dw-gzh02

赛题任务

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

赛题数据

赛题数据由训练集和测试集组成,具体情况如下:

  • 训练集:共有5070条数据,用于构建您的预测模型

  • 测试集:共有1000条数据,用于验证预测模型的性能。

其中训练集数据包含有9个字段:性别、出生年份、体重指数、糖尿病家族史、舒张压、口服耐糖量测试、胰岛素释放实验、肱三头肌皮褶厚度、患有糖尿病标识(数据标签)。

评分标准

采用二分类任务中的F1-score指标进行评价,F1-score越大说明预测模型性能越好,F1-score的定义如下:

其中:

Tips: 根据题意,糖尿病遗传风险检测挑战赛中会提供2个数据集,分别是训练数据集和测试数据集,其中训练数据集有特征数据和数据标签(患者是否得糖尿病),测试数据集只有特征数据,我们需要根据糖尿病遗传风险预测模型,比赛方通过测试数据集来评估模型的预测准确性,模型预测的准确性越高越好。

Ref:

  • 知乎:二分类问题常见的评价指标

    https://zhuanlan.zhihu.com/p/55324860

赛题Baseline

Tips:  在本次比赛中,我们将提供python代码用于比赛数据的分析与模型构建,如果你还不熟悉赛题中的相关代码与原理,可以参考相关学习资料或在Datawhale交流群中来解决你遇到的问题。

  • 步骤1:报名比赛:

    https://challenge.xfyun.cn/topic/info?type=diabetes&ch=ds22-dw-gzh02

  • 步骤2:下载比赛数据(点击比赛页面的赛题数据)

  • 步骤3:解压比赛数据,并使用pandas进行读取

导入第三方库

Tips: 在本baseline中,我们通过pandas对数据进行处理,通过lightgbm算法来构建糖尿病遗传风险预测模型

Ref:

  • pandas用法-全网最详细教程

    https://blog.csdn.net/yiyele/article/details/80605909

  • Joyful-Pandas开源教程

  • 我的Pandas学习经历及动手实践

  • 深入理解LightGBM

import pandas as pd
import lightgbm

数据预处理

Tips: 在本环节中,我们通常需要检测数据的质量,包括重复值、异常值、缺失值、数据分布和数据特征等,通过训练数据的预处理,我们能得到更高质量的训练数据,这有助于构建更加准确的预测模型。

在本baseline中,我们发现舒张压特征中存在缺失值,我们采用了填充缺失值的方法进行处理,当然也有其他的处理方法,如果感兴趣可以尝试。

Ref:

  • 机器学习(三):数据预处理--数据预处理的基本方法

    https://zhuanlan.zhihu.com/p/100442371

data1=pd.read_csv('比赛训练集.csv',encoding='gbk')
data2=pd.read_csv('比赛测试集.csv',encoding='gbk')
#label标记为-1
data2['患有糖尿病标识']=-1
#训练集和测试机合并
data=pd.concat([data1,data2],axis=0,ignore_index=True)
#将舒张压特征中的缺失值填充为-1
data['舒张压']=data['舒张压'].fillna(-1)

特征工程

Tips:在本环节中,我们需要对数据进行特征的构造,目的是最大限度地从原始数据中提取特征以供算法和模型使用,这有助于构建更加准确的预测模型。

Ref:

  • 用机器学习神器sklearn做特征工程!

  • 特征工程在实际业务中的应用!

#特征工程
"""
将出生年份换算成年龄
"""
data['出生年份']=2022-data['出生年份']  #换成年龄"""
人体的成人体重指数正常值是在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)#糖尿病家族史
"""
无记录
叔叔或者姑姑有一方患有糖尿病/叔叔或姑姑有一方患有糖尿病
父母有一方患有糖尿病
"""
def FHOD(a):if a=='无记录':return 0elif a=='叔叔或者姑姑有一方患有糖尿病' or a=='叔叔或姑姑有一方患有糖尿病':return 1else:return 2data['糖尿病家族史']=data['糖尿病家族史'].apply(FHOD)
"""
舒张压范围为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)#------------------------------------
#将处理好的特征工程分为训练集和测试集,其中训练集是用来训练模型,测试集用来评估模型准确度
#其中编号和患者是否得糖尿病没有任何联系,属于无关特征予以删除
train=data[data['患有糖尿病标识'] !=-1]
test=data[data['患有糖尿病标识'] ==-1]
train_label=train['患有糖尿病标识']
train=train.drop(['编号','患有糖尿病标识'],axis=1)
test=test.drop(['编号','患有糖尿病标识'],axis=1)

构建模型

Tips:在本环节中,我们需要对训练集进行训练从而构建相应的模型,在本baseline中我们使用了Lightgbm算法进行数据训练,当然你也可以使用其他的机器学习算法/深度学习算法,甚至你可以将不同算法预测的结果进行综合,反正最后的目的是获得更高的预测准确度,向着这个目标出发~

在本节中,我们将训练数据使用5折交叉验证训练的方法进行训练,这是一个不错的提升模型预测准确度的方法

Ref:

  • https://github.com/datawhalechina/competition-baseline

  • https://github.com/datawhalechina/team-learning-data-mining

  • CSDN:Kaggle上分技巧——单模K折交叉验证训练+多模型融合

  • https://blog.csdn.net/fengjiandaxia/article/details/123096182

#使用Lightgbm方法训练数据集,使用5折交叉验证的方法获得5个测试集预测结果
def select_by_lgb(train_data,train_label,test_data,random_state=2022,n_splits=5,metric='auc',num_round=10000,early_stopping_rounds=100):kfold = KFold(n_splits=n_splits, shuffle=True, random_state=random_state)fold=0result=[]for train_idx, val_idx in kfold.split(train_data):random_state+=1train_x = train_data.loc[train_idx]train_y = train_label.loc[train_idx]test_x = train_data.loc[val_idx]test_y = train_label.loc[val_idx]clf=lightgbmtrain_matrix=clf.Dataset(train_x,label=train_y)test_matrix=clf.Dataset(test_x,label=test_y)params={'boosting_type': 'gbdt',  'objective': 'binary','learning_rate': 0.1,'metric': metric,'seed': 2020,'nthread':-1 }model=clf.train(params,train_matrix,num_round,valid_sets=test_matrix,early_stopping_rounds=early_stopping_rounds)pre_y=model.predict(test_data)result.append(pre_y)fold+=1return resulttest_data=select_by_lgb(train,train_label,test)
#test_data就是5折交叉验证中5次预测的结果
pre_y=pd.DataFrame(test_data).T
#将5次预测的结果求取平均值,当然也可以使用其他的方法
pre_y['averge']=pre_y[[i for i in range(5)]].mean(axis=1)
#因为竞赛需要你提交最后的预测判断,而模型给出的预测结果是概率,因此我们认为概率>0.5的即该患者有糖尿病,概率<=0.5的没有糖尿病
pre_y['label']=pre_y['averge'].apply(lambda x:1 if x>0.5 else 0)
pre_y

结果提交

Tips:在本环节中,我们需要将最后的预测结果提交到数据竞赛平台中,需要注意的是我们要严格按照竞赛平台的文件格式提交要求。

result=pd.read_csv('提交示例.csv')
result['label']=pre_y['label']
result.to_csv('result.csv',index=False)

其中result.csv就是需要提交到平台的文件,进入到数据竞赛平台,点击提交结果,选择result.csv文件即可完成结果提交

后续

经过简单的学习,我们完成了糖尿病遗传风险检测挑战赛的baseline任务,接下来应该怎么做呢?主要是以下几个方面:

  • 继续尝试不同的预测模型或特征工程来提升模型预测的准确度

  • 加入Datawhale比赛交流群,获取其他更加有效的上分信息

  • 查阅糖尿病遗传风险预测相关资料,获取其他模型构建方法

  • ...

总之,就是在baseline的基础上不断的改造与尝试,通过不断的实践来提升自己的数据挖掘能力,正所谓【纸上得来终觉浅,绝知此事要躬行】,也许你熟练掌握机器学习的相关算法,能熟练推导各种公式,但如何将学习到的方法应用到实践工程中,需要我们不断的尝试与改进,没有一个模型是一步所得,向最后的冠军冲击~

Ref:

  • 下一站,向冠军冲击!

  • 鱼佬:从数据竞赛到工作!

  • 机器学习神器Scikit-Learn保姆教程

  • 我的机器学习之路

  • 《Datawhale人工智能培养方案》

关注Datawhale公众号,回复“数据挖掘”或“CV”或“NLP”可邀请进相关赛事交流群,已在的不用再加入。

整理不易,三连

我写了一份初学者的学习实践教程!相关推荐

  1. GitHub标星2600,从零开始的深度学习实用教程 | PyTorch官方推荐

    圆栗子 发自 凹非寺  量子位 报道 | 公众号 QbitAI GitHub上面,有个新发布的深度学习实践教程,叫PracticalAI,被PyTorch官方推特翻了牌,已经收获2600多标星. △  ...

  2. 写给初学者──如何学习C语言

    学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通.如何以最小的代价学习并精通C语言是本文的主题.请注意,即使是"最小的代价",也绝不是什么捷径,而是以最短的时间取得最多 ...

  3. 转载:一位资深程序员大牛给予Java初学者的学习路线建议

    一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来 ...

  4. (转)一位资深程序员大牛给予Java初学者的学习路线建议

    一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来 ...

  5. 初学者如何学习java编程?有必要参加培训班吗?

    初学Java迷茫,是因为没有找到正确的学习思路.初学者如何学习java编程?有必要参加java培训班吗?本文为大家总结了四条,一定能对刚入门的你有启发. 初学者如何学习java编程? 1.兴趣是学习最 ...

  6. 初学者---Android 学习资料

    转自: 1.hanhailong/AndroidStudyResources https://github.com/hanhailong/AndroidStudyResources 2.Android ...

  7. 程序员如何写好一份简历去找工作?这些地方你一定要注意!

    找工作的两大步骤 一.简历 首先我们说简历,一份好的简历是让别人还没有接触你的时候,就对你印象颇深.简历就好比你相亲时提供给对方的资料,未见其人,那就先从一份资料中了解这个人怎么样.如何把简历写的漂亮 ...

  8. 一位资深程序员大牛(4-5年经验)给予Java初学者的学习建议

    这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要 ...

  9. 6条适用于PHP初学者的学习线路和建议

    2019独角兽企业重金招聘Python工程师标准>>> 适用于PHP初学者的学习线路和建议,本期我们为大家总结出6条建议,废话不多说,我们先来看下PHP初学者的学习线路: (1) 熟 ...

最新文章

  1. RSA、MD5等加密算法的区别和应用
  2. javascript 防止息屏
  3. oracle如何删除重复数据第一条,oracle删除重复数据保留第一条记录
  4. 使用BPF跟踪Linux内核
  5. Curl http_code 状态码
  6. Android控制手机振动相关
  7. gparted在线扩分区大小
  8. MyBatis(六)SqlSessionTemplate是如何保证线程安全的
  9. SSH之Hibernate总结篇
  10. 【转】ABP源码分析二十八:ABP.MemoryDB
  11. linux brctl命令,Linux中brctl命令起什么作用呢?
  12. 反应器(Reactor):用于事件多路分离和分派的体系结构模式
  13. Flutter基础—布局模型之滚动块
  14. VMware虚拟机中大小写不停切换的问题
  15. 任天堂如何通过旧技术赢得胜利
  16. 利用邮件合并批量制作带照片的准考证
  17. 悦刻电子烟一代二代三代四代区别是什么?
  18. python3 解压7z文件
  19. 学术界AV1编码优化技术的进展
  20. 关于Win10已设置默认打开方式的清除方法

热门文章

  1. Java 服务接入 OpenTracing(1)--从 Tracing 到 OpenTracing
  2. 微信小程序识别ios平台的底部黑杠padding
  3. “首月0保费”导流模式告终 知名互联网保险平台开始裁员
  4. IPad分屏,当电脑第二显示屏
  5. Vivado中FIFO遇到【Common17-55】警告总结
  6. iOS开发 - 使用IJKPlayer时,关于需求要边下边播的缓存功能,退回来后播放缓存不再耗流量
  7. 如何查看xshell保存的密码
  8. 关于智能码控门禁系统项目的二维码验证问题
  9. 解决知乎页面打印时下方文字被遮挡的问题
  10. 什么样的代码是好代码_什么使好代码3 7