Advertisement

阿里天池大赛[人工智能辅助糖尿病遗传风险预测]赛后总结

阅读量:

题目以及数据介绍

机器学习驱动的糖尿病遗传风险分析赛事

GitHub代码库提供了一系列支持材料与资源链接GitHub

初始思想

1.从头开始,先看一下初始数据以及数据的简单分析吧

训练数据,最后一列是血糖:

trainA

A榜测试数据

testA

第九个特征与标签的关系分布

9

第三十八个

38

各个特征计数(有点糊)

count

各个特征(标签)的标准差

std

热力图(反应相关性)

hot_map

标签数量分布(简单取整)

label
  1. 对以上数据分析一下:
    1)特征的数据分布基本上是类似图中的分布规律(符合实际情况,说明该指标大部分人都正常)
    2)个别特征的标准差比较大,说明有离群值,先baseline在进行离群值处理
    3)个别特征缺失值比较多(尤其中间五个,缺失近乎75%,实际指标为乙肝五项),所以暂不使用
    4)由于特征是医学指标,所以需要挖掘内在的医学上的关系
    5)数据中时间以及id暂不使用,并且性别映射为数值: 男1女0
  2. 根据上述分析进行简单模型跑出baseline,xgboost模型
复制代码
    # 得分score按照题目要求实现
    # 利用xgboost的树模型以及泊松分布(label大致符合泊松分布)
    # 误差rmse为均方根误差(均方误差开方)
    # 参数如下,1000-50次迭代
    para = {
    'booster': 'gbtree',
    'objective': 'count:poisson',
    'eval_metric': 'rmse',
    'eta': 0.3,  # alpha
    'silent': 1,
    'max_depth': 3,
    'subsample': 0.9,  # 0.9样本选取率 防止过拟合
    "miss": -999,
    "lambda":1.5
    }

结果:
本地cv-5折测试得分score

score0

提交后得分score

score

效果不是很好0.0

中期思想

  1. 作为医学指标,我们应在医学领域进行分类时将其与同一器官及其平均值与总量结合起来分析。

  2. 设定阈值后执行删除操作。通过本地测试验证,最佳阈值设定为18。

复制代码
    # 去掉乙肝五项 id 体检日期
    train_file.drop(['乙肝表面抗原', '乙肝表面抗体', '乙肝e抗原', '乙肝e抗体', '乙肝核心抗体', 'id', '体检日期'],axis=1,inplace=True)
    test_file.drop(['乙肝表面抗原', '乙肝表面抗体', '乙肝e抗原', '乙肝e抗体', '乙肝核心抗体', 'id', '体检日期'],axis=1,inplace=True)
    # 白球比例是指肝功能白球比例(白球比)=白蛋白/球蛋白=白蛋白/(总蛋白-白蛋白)
    # 单核细胞 白细胞冲突
    train_file.drop(['单核细胞%','白球比例','白蛋白','*总蛋白'],axis=1,inplace=True)
    test_file.drop(['单核细胞%','白球比例','白蛋白','*总蛋白'],axis=1,inplace=True)
    
    # 合并相似项目 酶
    train_file['酶'] = train_file['*天门冬氨酸氨基转换酶'] + train_file["*丙氨酸氨基转换酶"] \
                  + train_file["*碱性磷酸酶"] + train_file["*r-谷氨酰基转换酶"]
    test_file['酶'] = test_file["*天门冬氨酸氨基转换酶"] + test_file["*丙氨酸氨基转换酶"] \
                 + test_file["*碱性磷酸酶"] + test_file["*r-谷氨酰基转换酶"]
    
    # 血细胞计数 * 平均参数
    train_file['红细胞总血红蛋白量'] = train_file['红细胞计数'] * train_file['红细胞平均血红蛋白量']
    test_file['红细胞总血红蛋白量'] = test_file['红细胞计数'] * test_file['红细胞平均血红蛋白量']
    
    train_file['红细胞总血红蛋白浓度'] = train_file['红细胞计数'] * train_file['红细胞平均血红蛋白浓度']
    test_file['红细胞总血红蛋白浓度'] = test_file['红细胞计数'] * test_file['红细胞平均血红蛋白浓度']
    
    train_file['红细胞总体积'] = train_file['红细胞计数'] * train_file['红细胞平均体积']
    test_file['红细胞总体积'] = test_file['红细胞计数'] * test_file['红细胞平均体积']
    
    train_file['血小板总体积'] = train_file['血小板计数'] * train_file['血小板平均体积']
    test_file['血小板总体积'] = test_file['血小板计数'] * test_file['血小板平均体积']
    # cv 0.7912094213627026
    
    # 肾指标
    train_file['肾'] = train_file['尿酸'] + train_file['尿素'] + train_file['肌酐']
    test_file['肾'] = test_file['尿酸'] + test_file['尿素'] + test_file['肌酐']
    
    # 嗜酸细胞
    train_file["嗜酸细胞"] = train_file['白细胞计数'] * train_file["嗜酸细胞%"]
    test_file["嗜酸细胞"] = test_file['白细胞计数'] * test_file["嗜酸细胞%"]
    
    # 删除嗜碱细胞 与嗜酸细胞矛盾
    train_file.drop(['嗜碱细胞%'],axis=1,inplace=True)
    test_file.drop(['嗜碱细胞%'],axis=1,inplace=True)
    
    # 删除年龄异常值
    train_file = train_file[train_file['血糖'] <= 18]
    
    # 利用lgb中goss+泊松模型的lgb参数设置
    # 1500-50迭代
    lgb_para = {
        'learning_rate': 0.03,  
        'boosting_type': 'goss',
        'objective': 'poisson',
        'metric': 'rmse',  
        'max_depth': 4,
        'sub_feature': 0.9,
        'colsample_bytree': 0.9,
        'verbose': -1 
    }

关于嗜酸性粒细胞

百度

lgb结果:

scorelag

效果尚可

xgboost版本:

复制代码
    xgb_para = {
    'booster': 'gbtree',
    'objective': 'count:poisson',
    'eval_metric': 'rmse',
    'eta': 0.03,  #
    'silent': 1,
    'max_depth': 4,    # 4 best
    'subsample': 0.9,  # 0.9 best
    "miss": -999,
    "colsample_bytree": 0.7,
    "lambda":1.5 # 1.5 best
    }

xgb结果:

xgboost ans

其实score差不多
但是
很明显xgboost的时间比lgb长

其他思想

  1. catboost应用
  2. cnn应用(效果不是很好)
  3. 上述模型的融合

心得感悟

总体而言,在处理某些专业领域时存在不足;尤其是那些需要高度专业性处理的方面;此外,在数据处理和建模方面仍需进一步提升能力;若缺乏扎实的数学功底,在面对数据分析时往往举步维艰。
接下来,建议进一步提升模型在数学方面的理解能力;例如本次采用的goss+泊松方法。

全部评论 (0)

还没有任何评论哟~