• 【Coggle 30 Days of ML】糖尿病遗传风险检测挑战赛(1)


    目录

    任务

    Just Do It!   

     1.导包

    2.读取数据并进行分析

    3.数据预处理

    4.模型选择

    5.预测

     6.评估指标

    7.得到提交文件


    任务

    • 任务1:报名比赛
      • 步骤1:报名比赛2022 iFLYTEK A.I.开发者大赛-讯飞开放平台
      • 步骤2:下载比赛数据(点击比赛页面的赛题数据)
      • 步骤3:解压比赛数据,并使用pandas进行读取;
      • 步骤4:查看训练集和测试集字段类型,并将数据读取代码写到博客;
    • 任务2:比赛数据分析
      • 步骤1:统计字段的缺失值,计算缺失比例;
        • 通过缺失值统计,训练集和测试集的缺失值分布是否一致?
        • 通过缺失值统计,有没有缺失比例很高的列?
      • 步骤2:分析字段的类型;
        • 有多少数值类型、类别类型?
        • 你是判断字段类型的?
        • 在博客中通过文字写出你的判断;
      • 步骤3:计算字段相关性;
        • 通过.corr()计算字段之间的相关性;
        • 有哪些字段与标签的相关性最高?
        • 尝试使用其他可视化方法将字段 与 标签的分布差异进行可视化;
    • 任务3:逻辑回归尝试

      • 步骤1:导入sklearn中的逻辑回归;
      • 步骤2:使用训练集和逻辑回归进行训练,并在测试集上进行预测;
      • 步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
      • 步骤4:将训练集20%划分为验证集,在训练部分进行训练,在测试部分进行预测,调节逻辑回归的超参数;
      • 步骤5:如果精度有提高,则重复步骤2和步骤3;如果没有提高,可以尝试树模型,重复步骤2、3;
    • 任务6:高阶树模型

      • 步骤1:安装LightGBM,并学习基础的使用方法;
      • 步骤2:将训练集20%划分为验证集,使用LightGBM完成训练,精度是否有提高?
      • 步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
      • 步骤4:尝试调节搜索LightGBM的参数;
      • 步骤5:将步骤4调参之后的模型从新训练,将最新预测的结果文件提交到比赛,截图分数;

    Just Do It!   

     1.导包

    1. import pandas as pd
    2. import seaborn as sns
    3. from lightgbm import LGBMClassifier
    4. from sklearn.pipeline import make_pipeline
    5. from sklearn.metrics import f1_score
    6. from sklearn.linear_model import LogisticRegression
    7. from sklearn.model_selection import train_test_split
    8. from sklearn.metrics import accuracy_score

    2.读取数据并进行分析

    查看训练集和测试集的形状和类型

    1. train_df = pd.read_csv('../data/糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
    2. test_df = pd.read_csv('../data/糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')
    3. print(train_df.shape, test_df.shape)
    4. print(train_df.dtypes, test_df.dtypes)

     

     查看训练集和测试集的缺失值

    1. # 缺失值计算
    2. print(train_df.isnull().mean(0))
    3. print(test_df.isnull().mean(0))
    4. # 相关性计算
    5. train_df.corr()

    可以看到,训练集和测试集中只有舒张压是有空值的。

    再画一下热度图

    1. # 绘制热度图
    2. plot = sns.heatmap(train_df.corr())

     

    根据相关性和热度图可以看出,肱三头肌皮褶厚度 和 体重指数 这两个特征对label的贡献是比较大的。

    3.数据预处理

    使用df.map功能(类似于df.apply功能)将包含 非数值型 的列对应的 非数值类型 转换成相应的数值类型,这样才能丢到模型去训练(模型只能理解数值型的数据)。

    同时,要对包含空值的列进行填充。

    1. dict_糖尿病家族史 = {
    2. '无记录': 0,
    3. '叔叔或姑姑有一方患有糖尿病': 1,
    4. '叔叔或者姑姑有一方患有糖尿病': 1,
    5. '父母有一方患有糖尿病': 2
    6. }
    7. train_df['糖尿病家族史'] = train_df['糖尿病家族史'].map(dict_糖尿病家族史)
    8. test_df['糖尿病家族史'] = test_df['糖尿病家族史'].map(dict_糖尿病家族史)
    9. train_df['舒张压'].fillna(train_df['舒张压'].mean().round(2), inplace=True)
    10. test_df['舒张压'].fillna(train_df['舒张压'].mean().round(2), inplace=True)
    11. train_df

     转换前

    转换后

    将训练集划分为训练集和验证集,方便本地进行测试,不然每天就三次提交机会,总不能每次调参都用平台的机会吧。

    1. # 把训练集划分为训练集和验证集,方便测试当前模型的好坏,并进行适当的调参
    2. train_df2,val_df,y_train,y_val = train_test_split(train_df.drop('患有糖尿病标识',axis=1),train_df['患有糖尿病标识'],test_size=0.3)
    3. train_df2

     划分后的训练集和验证集数量为

    1. print('train2 length:',len(train_df2),' ',len(y_train))
    2. print('val length:',len(val_df),' ',len(y_val))

     

    4.模型选择

    1. # 选择模型
    2. #
    3. # 使用逻辑回归进行训练
    4. # model = LogisticRegression()
    5. # model.fit(train_df.drop('编号',axis=1),y_train)
    6. # 构建模型
    7. # model = make_pipeline(
    8. # MinMaxScaler(),
    9. # DecisionTreeClassifier()
    10. # )
    11. # model.fit(train_df.drop('编号',axis=1),y_train)
    12. model = LGBMClassifier(
    13. objective='binary',
    14. max_depth=3,
    15. n_estimators=4000,
    16. n_jobs=-1,
    17. verbose=-1,
    18. verbosity=-1,
    19. learning_rate=0.1,
    20. )
    21. model.fit(train_df2.drop('编号',axis=1),y_train,eval_set=[(val_df.drop('编号',axis=1),y_val)])

    统一命名为model了,这样后面的代码都直接调用model就可以了,而用不同的模型只需要改一下model后面的就行了。目前写了逻辑回归、决策树、LGBM三种方法,后续可能会更新新的模型。目前榜上大佬们已经达到100%准确率了,太吊了。不知道他们用的什么模型。

    5.预测

    1. # 预测训练集
    2. train_df2['label'] = model.predict(train_df2.drop('编号',axis=1))
    3. # 预测训练集
    4. train_df2['label'] = model.predict(train_df2.drop('编号',axis=1))

     6.评估指标

    平台使用F1评估,我本地测试的时候加了个accuracy,F1采用了macro方式计算。

    1. # 评估模型指标
    2. def eval(y_true,y_pred):
    3. lr_acc = accuracy_score(y_true,y_pred)
    4. lr_f1 = f1_score(y_true,y_pred,average='macro')
    5. print(f"lr_acc:{lr_acc},lr_f1:{lr_f1}")
    1. print('训练集指标:')
    2. eval(y_train,train_df2['label'])
    3. print('验证集指标:')
    4. eval(y_val,val_df['label'])

    7.得到提交文件

    1. # 预测测试集
    2. test_df['label'] = model.predict(test_df.drop('编号',axis=1))
    3. test_df

     为了防止提交文件被新的输出覆盖,特地给输出文件加了个时间标注。

    test_df.rename({'编号':'uuid'},axis=1)[['uuid','label']].to_csv('submit'+str(datetime.now().strftime('%m_%d_%H_%M_%S'))+'.csv',index=None)

     OK,Fine! 

  • 相关阅读:
    mapbox使用marker创建html点位信息
    Redis高可用 哨兵 主从 集群
    boom lab分析
    强化学习问题(一)--- 输入conda activate base无法激活虚拟环境
    反射机制(草稿)
    【论文阅读】Uformer:A General U-Shaped Transformer for Image Restoration
    优化算法 - Adadelta
    【UE 材质】简单的闪闪发光材质
    springboot+vue垃圾分类系统源码
    搭建git私人仓库
  • 原文地址:https://blog.csdn.net/doubleguy/article/details/125894120