【Kaggle实战】从零到一:多分类模型融合策略在肥胖风险预测中的应用

【Kaggle实战】从零到一:多分类模型融合策略在肥胖风险预测中的应用
1. 初识Kaggle肥胖风险预测赛题第一次接触Kaggle的肥胖风险多分类预测赛题时我像发现新大陆一样兴奋。这个来自2024年2月Playground系列赛的题目用看似简单的健康数据隐藏着丰富的模式等待挖掘。数据集包含18个特征字段从基础的性别、年龄、身高体重到饮食偏好如高热量食物摄入频率、生活习惯体育锻炼频率、吸烟情况等最后的目标变量NObeyesdad将肥胖程度精细划分为7个等级——从体重不足到肥胖III级。数据探索阶段有几个有趣的发现性别与肥胖类型的强关联Obesity_Type_II患者100%为男性而Obesity_Type_III患者99.9%是女性身高体重分布呈现明显的聚类特征通过PCA降维后能看到7个类别自然形成的边界家族超重史family_history_with_overweight对预测结果影响显著这与医学常识高度吻合# 数据分布可视化示例 import seaborn as sns fig, axs plt.subplots(1,2,figsize(12,5)) sns.histplot(datatrain, xNObeyesdad, hueGender, axaxs[0]) axs[1].pie(train[NObeyesdad].value_counts(), labelstrain[NObeyesdad].unique(), autopct%1.1f%%) plt.suptitle(目标变量分布分析)2. 构建基础模型的踩坑经验在搭建单模型的过程中我尝试了四种主流算法每个都踩过不少坑随机森林的过拟合陷阱初始版本的随机森林在训练集上准确率高达99.9%但验证集只有89.5%。通过调整max_depth15和min_samples_leaf50后过拟合明显改善。这里的关键是保持树的一定复杂度同时用早停策略控制生长。LightGBM的参数调优使用Optuna进行超参数搜索时发现这几个参数对结果影响最大learning_rate最佳值在0.03附近num_leaves控制在300-500之间效果较好reg_alpha/reg_lambdaL1/L2正则化系数需要精细调节# LGBM参数优化示例 def objective(trial): params { learning_rate: trial.suggest_float(learning_rate, 0.01, 0.1), num_leaves: trial.suggest_int(num_leaves, 100, 1000), reg_alpha: trial.suggest_float(reg_alpha, 1e-3, 10.0), reg_lambda: trial.suggest_float(reg_lambda, 1e-3, 10.0) } model LGBMClassifier(**params) return cross_val_score(model, X, y, cv5).mean() study optuna.create_study(directionmaximize) study.optimize(objective, n_trials50)XGBoost的GPU加速技巧在Colab的T4 GPU上设置tree_methodgpu_hist后训练速度提升8倍。但需要注意数据需要先转换为DMatrix格式开启grow_policylossguide能更好利用GPU并行计算监控GPU内存使用batch_size不宜过大CatBoost的类别特征处理这个算法对类别特征的处理堪称完美只需简单指定分类列cat_features [Gender,family_history_with_overweight,FAVC] model CatBoostClassifier(cat_featurescat_features)但要注意设置early_stopping_rounds50防止过拟合同时用plotTrue监控训练过程。3. 模型融合的进阶策略单一模型的极限准确率在91%左右徘徊要突破这个天花板必须使用模型融合。我尝试了三种主流方法加权平均法给不同模型预测概率分配权重weights {rf:0.2, lgb:0.5, xgb:0.2, cat:0.1} ensemble_proba (weights[rf]*rf_proba weights[lgb]*lgb_proba weights[xgb]*xgb_proba weights[cat]*cat_proba)关键点通过网格搜索确定最优权重组合需保证各模型预测概率校准良好最好使用交叉验证产生的OOF预测Stacking的实战细节构建二级模型时我选择逻辑回归作为meta-model先用5折生成基模型的OOF预测将预测概率作为新特征添加原始特征的重要统计量均值、标准差等用简单模型组合这些特征# Stacking实现示例 from sklearn.linear_model import LogisticRegression base_models [rf_model, lgb_model, xgb_model] meta_features [] for model in base_models: oof_pred cross_val_predict(model, X, y, methodpredict_proba) meta_features.append(oof_pred) meta_X np.hstack(meta_features) meta_model LogisticRegression() meta_model.fit(meta_X, y)投票法的精妙之处在测试多种投票策略后发现软投票Soft Voting效果最好基于预测概率而非硬标签给表现更好的模型更高权重对类别不平衡数据更鲁棒实际应用中我设计了一个动态权重分配方案model_weights { rf: 1/(1 - rf_score), lgb: 1/(1 - lgb_score), xgb: 1/(1 - xgb_score) }4. 从比赛到实战的思考经过多轮调优最终融合模型在私有排行榜上达到92.3%准确率进入前1%。这个过程中有几个深刻体会特征工程的边际效应在比赛后期创造新特征带来的提升越来越小。这时应该转向模型融合优化重新评估特征重要性考虑删除冗余特征交叉验证的注意事项采用分层10折验证时发现数据分布不均匀会导致某些折表现异常需要监控每折分数标准差可尝试分组KFold如按性别分组业务逻辑的融合将医学知识融入模型强制BMI与肥胖等级的对应关系对矛盾预测如BMI正常但预测肥胖特殊处理添加基于规则的后处理# 基于BMI的后处理示例 def postprocess(row): bmi row[Weight]/(row[Height]**2) if bmi 18.5 and row[pred] ! Insufficient_Weight: return Insufficient_Weight elif 18.5 bmi 25 and row[pred] ! Normal_Weight: return Normal_Weight return row[pred]最终提交的解决方案不仅考虑模型精度还需要预测结果符合医学常识各性别组错误率均衡对边缘案例有合理处理这次实战让我深刻认识到一个好的数据科学项目需要在模型性能和业务逻辑之间找到平衡点。Kaggle竞赛就像现实问题的缩影那些在排行榜上闪耀的成绩背后是无数次的实验、失败和迭代。