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


    目录

    任务

    Just Do It!    

    1.特征工程

     2.特征筛选

    3.K折交叉验证​​​​​​​


    任务

    • 任务4:特征工程(使用pandas完成)

      • 步骤1:统计每个性别对应的【体重指数】、【舒张压】平均值
      • 步骤2:计算每个患者与每个性别平均值的差异;
      • 步骤3:在上述基础上将训练集20%划分为验证集,使用逻辑回归完成训练,精度是否有提高?
      • 步骤4:思考字段含义,尝试新的特征,将你的尝试写入博客;
    • 任务5:特征筛选

      • 步骤1:使用树模型完成模型的训练,通过特征重要性筛选出Top5的特征;
      • 步骤2:使用筛选出的特征和逻辑回归进行训练,在验证集精度是否有提高?
      • 步骤3:如果有提高,为什么?如果没有提高,为什么?
      • 步骤4:将你的尝试写入博客;
    • 任务7:多折训练与集成

      • 步骤1:使用KFold完成数据划分;
      • 步骤2:使用StratifiedKFold完成数据划分;
      • 步骤3:使用StratifiedKFold配合LightGBM完成模型的训练和预测
      • 步骤4:在步骤3训练得到了多少个模型,对测试集多次预测,将最新预测的结果文件提交到比赛,截图分数;
      • 步骤5:使用交叉验证训练5个机器学习模型(svm、lr等),使用stacking完成集成,将最新预测的结果文件提交到比赛,截图分数;

    Just Do It!    

    1.特征工程

    特征工程部分很吃感觉,对于构建新的特征来说,试了好几个,构造出来效果反而更差了。emmm,只能说多尝试把。。。

    1. # 特征工程
    2. # 统计每个性别对应的【体重指数】、【舒张压】平均值
    3. # train_df.groupby('性别').describe()[['体重指数','舒张压']]
    4. train_df.groupby('性别').mean()[['体重指数','舒张压']]

    1. # train_df['体重指数-平均值']=train_df['体重指数']-train_df['性别'].map(
    2. # train_df.groupby('性别')['体重指数'].mean()
    3. # )
    4. # test_df['体重指数-平均值']=test_df['体重指数']-test_df['性别'].map(
    5. # test_df.groupby('性别')['体重指数'].mean()
    6. # )
    7. # test_df['体重指数-平均值']
    8. train_df['舒张压'].fillna(train_df['舒张压'].mean().round(2), inplace=True)
    9. test_df['舒张压'].fillna(train_df['舒张压'].mean().round(2), inplace=True)
    10. dict_糖尿病家族史 = {
    11. '无记录': 0,
    12. '叔叔或姑姑有一方患有糖尿病': 1,
    13. '叔叔或者姑姑有一方患有糖尿病': 1,
    14. '父母有一方患有糖尿病': 2
    15. }
    16. train_df['糖尿病家族史'] = train_df['糖尿病家族史'].map(dict_糖尿病家族史)
    17. test_df['糖尿病家族史'] = test_df['糖尿病家族史'].map(dict_糖尿病家族史)
    18. train_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')
    19. test_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')
    20. train_df['性别'] = train_df['性别'].astype('category')
    21. test_df['性别'] = train_df['性别'].astype('category')
    22. train_df['年龄'] = 2022 - train_df['出生年份']
    23. test_df['年龄'] = 2022 - test_df['出生年份']
    24. train_df['口服耐糖量测试_diff'] = train_df['口服耐糖量测试'] - train_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']
    25. test_df['口服耐糖量测试_diff'] = test_df['口服耐糖量测试'] - test_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']
    26. train_df['体重指数+肱三头肌皮褶厚度']=train_df['肱三头肌皮褶厚度']+train_df['体重指数']
    27. train_df
    28. test_df['体重指数+肱三头肌皮褶厚度']=test_df['肱三头肌皮褶厚度']+test_df['体重指数']
    29. test_df

     接着可以进行标准化

    1. # 标准化
    2. train_df.loc[:,train_df.columns!='患有糖尿病标识'] = preprocessing.scale(train_df.drop('患有糖尿病标识',axis=1))
    3. train_df

    为了方便后续模型融合,用到了xgboost,不支持类别型数据。因此需要将类别型的数据转换为数值型。

    1. train_df[['性别','糖尿病家族史']]=train_df[['性别','糖尿病家族史']].astype('int64')
    2. train_df.dtypes
    3. test_df[['性别','糖尿病家族史']]=test_df[['性别','糖尿病家族史']].astype('int64')
    4. test_df.dtypes

     

     划分训练集和验证集

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

     2.特征筛选

    这部分其实通过树模型的feature_importances_属性就可以得到,然后再排个序,根据顺便挑选我们想要的前几个特征就可以了。

    1. # 特征筛选
    2. predictors = [i for i in train_df2.drop('编号',axis=1).columns]
    3. feat_imp = pd.Series(model.feature_importances_, predictors).sort_values(ascending=False)
    4. feat_imp

    3.K折交叉验证

    模型选择部分,用了lr、xgb、svm、lgbm做stacking模型融合。

    1. # 选择模型
    2. #
    3. # 使用逻辑回归进行训练
    4. model1 = make_pipeline(
    5. MinMaxScaler(),
    6. LogisticRegression()
    7. )
    8. # model.fit(train_df.drop('编号',axis=1),y_train)
    9. # 构建模型
    10. # model.fit(train_df.drop('编号',axis=1),y_train)
    11. # model3 = LGBMClassifier(
    12. # objective='binary',
    13. # max_depth=8,
    14. # device_type='gpu',
    15. # n_estimators=8000,
    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)])
    22. model2 = make_pipeline(
    23. MinMaxScaler(),
    24. XGBClassifier(
    25. n_estimators=4000,
    26. max_depth=5,
    27. random_state=42,
    28. device_type='gpu',
    29. early_stopping_rounds=30,
    30. n_jobs=-1,
    31. verbose=-1,
    32. verbosity=-1,
    33. )
    34. )
    35. model3 = make_pipeline(
    36. MinMaxScaler(),
    37. LGBMClassifier(
    38. objective='binary',
    39. max_depth=5,
    40. device_type='gpu',
    41. n_estimators=5000,
    42. n_jobs=-1,
    43. verbose=-1,
    44. verbosity=-1,
    45. learning_rate=0.1,
    46. )
    47. )
    48. model4 = make_pipeline(
    49. MinMaxScaler(),
    50. SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')
    51. )
    52. estimators = [
    53. ('xgb', XGBClassifier(n_estimators=4000, random_state=42)),
    54. ('lr',model1),
    55. ('lgbm',model3),
    56. ('svm',model4)
    57. ]
    58. model = StackingClassifier(
    59. estimators=estimators
    60. )

    K折交叉验证,此处K设置成了8。

    1. # K折交叉验证
    2. def k_fold(model, kf, X_tr, y, X_te, cate_col=None):
    3. train_pred = np.zeros( (len(X_tr), len(np.unique(y))) )
    4. test_pred = np.zeros( (len(X_te), len(np.unique(y))) )
    5. cv_clf = []
    6. for tr_idx, val_idx in kf.split(X_tr, y):
    7. x_tr = X_tr.iloc[tr_idx]; y_tr = y.iloc[tr_idx]
    8. x_val = X_tr.iloc[val_idx]; y_val = y.iloc[val_idx]
    9. eval_set = [(x_val, y_val)]
    10. model.fit(x_tr, y_tr)
    11. cv_clf.append(model)
    12. train_pred[val_idx] = model.predict_proba(x_val)
    13. test_pred += model.predict_proba(X_te)
    14. test_pred /= kf.n_splits
    15. return train_pred, test_pred, cv_clf
    16. train_pred, test_pred, cv_clf = k_fold(
    17. model, KFold(n_splits=8),
    18. train_df2.drop('编号',axis=1),
    19. y_train,
    20. val_df.drop('编号',axis=1),
    21. )
    22. val_df['label'] = test_pred.argmax(1)

    分数反而低了。。。接着调参把。

    OK,Fine! 

  • 相关阅读:
    Linux Docker图形化工具Portainer如何进行远程访问?
    Roreg复现
    Redis6笔记04 主从复制,集群,应用问题,Redis6新功能
    1591 - Data Mining (UVA)
    不会DRF?源码都分析透了确定不来看?
    Vulkan入门——编译Shaderc
    codeforces刷题二
    工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64
    成型vue3项目引入electron通信
    MySQL进阶篇2-索引的创建和使用
  • 原文地址:https://blog.csdn.net/doubleguy/article/details/125917466