
Kaggle肥胖预测竞赛四模型加权融合实战与性能优化策略在数据科学竞赛中单一模型往往难以捕捉数据中的所有复杂模式。本文将深入探讨如何通过随机森林、LightGBM、XGBoost和CatBoost四种模型的加权融合在Kaggle肥胖风险预测竞赛中实现0.916的准确率。不同于基础教程我们将聚焦于模型融合的实战细节、权重优化方法论以及避免过拟合的高级技巧为中级Kaggle玩家提供可直接复用的进阶策略。1. 竞赛背景与数据特性解析肥胖风险预测是典型的多分类问题目标是将个体分为7个体重类别从体重不足到III级肥胖。原始数据集包含18个特征涵盖人口统计、饮食习惯、运动频率等多个维度。通过EDA分析我们发现几个关键洞察性别与肥胖类型的强关联Obesity_Type_II患者100%为男性而Obesity_Type_III患者99%为女性BMI的隐含价值虽然数据集中未直接提供BMI但通过Height和Weight计算的BMI与目标变量相关性达0.89类别不平衡问题某些类别如Obesity_Type_II样本量仅为其他类别的1/5# BMI特征工程代码示例 def extract_features(df): df[BMI] df[Weight]/(df[Height]**2) return df # 类别分布可视化 plt.figure(figsize(10,6)) sns.countplot(xNObeyesdad, datatrain, ordertrain[NObeyesdad].value_counts().index) plt.xticks(rotation45) plt.title(Class Distribution)提示在融合模型中类别不平衡问题需要通过加权损失函数或过采样技术处理否则模型会偏向多数类。2. 基础模型构建与调优2.1 随机森林的定制化改进传统随机森林直接应用于该数据集只能达到0.897的准确率。我们通过以下改进提升至0.906类别权重调整使用class_weightbalanced_subsample嵌入编码优化采用MEstimateEncoder处理分类变量特征选择基于置换重要性剔除低贡献特征from sklearn.ensemble import RandomForestClassifier from category_encoders import MEstimateEncoder rfc_pipeline make_pipeline( MEstimateEncoder(colscategorical_cols), RandomForestClassifier(n_estimators500, max_depth10, class_weightbalanced_subsample, random_state42) )2.2 LightGBM的超参数优化使用Optuna进行50轮贝叶斯优化关键参数空间设计如下参数搜索范围最优值learning_rate[0.001, 0.1]0.031max_depth[2, 20]10lambda_l1[0.1, 20]0.0097lambda_l2[0.1, 20]0.0402num_leaves[10, 1000]87import optuna from lightgbm import LGBMClassifier def objective(trial): params { learning_rate: trial.suggest_float(learning_rate, 0.001, 0.1, logTrue), max_depth: trial.suggest_int(max_depth, 2, 20), lambda_l1: trial.suggest_float(lambda_l1, 0.1, 20, logTrue), lambda_l2: trial.suggest_float(lambda_l2, 0.1, 20, logTrue) } model LGBMClassifier(**params) score cross_val_score(model, X, y, scoringaccuracy).mean() return score study optuna.create_study(directionmaximize) study.optimize(objective, n_trials50)2.3 XGBoost与CatBoost的对比实验两种梯度提升框架在相同数据上表现出不同特性XGBoost优势对数值型特征处理更鲁棒GPU加速效率更高比CatBoost快约15%自定义损失函数更灵活CatBoost优势自动处理类别变量无需单独编码对超参数敏感性较低内置对抗过拟合机制我们通过早停策略early stopping和动态学习率衰减优化两者表现# XGBoost早停实现 xgb_params { eval_metric: mlogloss, early_stopping_rounds: 50, learning_rate: 0.05 } xgb.fit(X_train, y_train, eval_set[(X_val, y_val)], verbose10)3. 模型融合策略深度剖析3.1 加权融合的数学原理加权融合的核心公式为$$ P_{final}(y|x) \sum_{i1}^{n} w_i \cdot P_i(y|x) $$其中$w_i$为第i个模型的权重$\sum w_i 1$。我们通过网格搜索确定最优权重组合模型权重范围最优权重RandomForest[0, 0.4]0.1LightGBM[0.2, 0.6]0.5XGBoost[0.1, 0.5]0.3CatBoost[0, 0.3]0.13.2 权重优化的实战代码from itertools import product # 定义权重搜索空间 weight_space { rfc: np.linspace(0, 0.4, 5), lgb: np.linspace(0.2, 0.6, 5), xgb: np.linspace(0.1, 0.5, 5), cat: np.linspace(0, 0.3, 4) } best_score 0 best_weights {} # 网格搜索最优组合 for w_rfc, w_lgb, w_xgb, w_cat in product(*weight_space.values()): total w_rfc w_lgb w_xgb w_cat if abs(total - 1.0) 0.01: # 权重和≈1 continue # 加权预测 weighted_proba (w_rfc*rfc_pred w_lgb*lgb_pred w_xgb*xgb_pred w_cat*cat_pred) final_pred weighted_proba.argmax(axis1) score accuracy_score(y_val, final_pred) if score best_score: best_score score best_weights {rfc:w_rfc, lgb:w_lgb, xgb:w_xgb, cat:w_cat} print(fBest Weights: {best_weights}, Score: {best_score:.4f})3.3 融合模型的性能对比我们测试了五种权重组合的验证集表现组合编号RFC权重LGB权重XGB权重CAT权重准确率10.00.60.30.10.91220.10.50.30.10.91630.20.40.30.10.91440.10.40.40.10.91550.00.70.20.10.911注意实际应用中需用交叉验证评估权重稳定性避免选择在特定fold过拟合的组合4. 高级优化技巧与避坑指南4.1 避免融合中的常见陷阱相关性过高的模型如果两个模型的预测结果相关系数0.9融合收益有限。建议先计算模型间的Spearman相关系数corr_matrix pd.DataFrame({ RFC: rfc_pred.argmax(axis1), LGB: lgb_pred.argmax(axis1), XGB: xgb_pred.argmax(axis1) }).corr(methodspearman)测试集泄露在确定权重时必须使用独立的验证集而非测试集计算资源平衡XGBoost和CatBoost的GPU实现可加速训练但需注意显存限制4.2 融合后的模型诊断通过混淆矩阵分析发现融合模型在Obesity_Type_II和Overweight_Level_II这两个最容易混淆的类别上表现提升最明显Predicted_0 Predicted_1 ... Predicted_6 Actual_0 0.94 0.02 ... 0.00 Actual_1 0.01 0.91 ... 0.00 ... Actual_6 0.00 0.00 ... 0.954.3 替代融合方案对比除加权融合外我们还实验了其他方法Stacking用逻辑回归作为元模型但效果略差于加权法0.913 vs 0.916Voting硬投票准确率仅0.902软投票达0.914Blending需要额外holdout集在小数据场景不适用最终选择加权融合因其实现简单可解释性强计算效率高5. 完整实现与部署建议5.1 端到端实现代码# 模型训练 models { rfc: RandomForestClassifier(**rfc_params), lgb: LGBMClassifier(**lgb_params), xgb: XGBClassifier(**xgb_params), cat: CatBoostClassifier(**cat_params) } # 存储各模型的OOF预测 oof_preds {} for name, model in models.items(): model.fit(X_train, y_train) oof_preds[name] model.predict_proba(X_val) # 加权融合 weights {rfc:0.1, lgb:0.5, xgb:0.3, cat:0.1} final_pred np.zeros_like(oof_preds[rfc]) for name, pred in oof_preds.items(): final_pred weights[name] * pred # 结果保存 submission pd.DataFrame({ id: test_ids, NObeyesdad: final_pred.argmax(axis1) }) submission.to_csv(submission.csv, indexFalse)5.2 实际应用建议动态权重调整当新增数据导致分布变化时应重新优化权重模型监控部署后持续跟踪各模型的预测分布变化资源优化在实时性要求高的场景可只保留效果最好的1-2个模型在医疗健康等高风险领域建议增加不确定性估计当不同模型的预测差异较大时如熵值1.5应标记为需要人工复核的案例。