Kaggle 肥胖预测赛:4模型融合实战,交叉验证准确率提升至 91.6%
Kaggle肥胖预测竞赛:四模型融合策略与91.6%准确率实战解析
在数据科学竞赛中,单一模型往往难以捕捉数据中的全部复杂模式。本文将深入探讨如何通过随机森林、LGBM、XGBoost和CatBoost四种模型的加权融合策略,在Kaggle肥胖风险预测竞赛中将交叉验证准确率提升至91.6%。我们将从数据预处理到模型调优,再到融合策略设计,提供一套完整的实战方案。
1. 竞赛背景与数据概览
肥胖风险预测是Kaggle Playground系列中的一项多分类任务,要求根据个体的生理特征、生活习惯等17个变量,预测其所属的7种肥胖等级。原始数据集包含20,758条训练样本和13,840条测试样本,特征类型涵盖数值型、类别型和序数型变量。
关键特征解析:
- BMI相关指标:身高(Height)、体重(Weight)的交互特征
- 生活习惯:高热量食物摄入频率(FAVC)、蔬菜消费(FCVC)
- 运动情况:体育活动频率(FAF)、热量监控(SCC)
- 人口统计:年龄(Age)、性别(Gender)、家族史(family_history_with_overweight)
数据分布特点:
# 目标变量分布可视化 plt.figure(figsize=(10,6)) sns.countplot(data=train, x='NObeyesdad', hue='Gender') plt.xticks(rotation=45) plt.title('Obesity Class Distribution by Gender')2. 基础模型构建与优化
2.1 随机森林模型
采用MEstimateEncoder处理类别变量,结合特征工程生成BMI衍生特征:
RFC = make_pipeline( FunctionTransformer(extract_features), MEstimateEncoder(cols=['Gender','family_history_with_overweight']), RandomForestClassifier(n_estimators=500, max_depth=10, random_state=42) ) # 10折交叉验证平均得分:0.9062.2 LGBM模型
通过Optuna进行超参数优化,关键参数配置:
best_params = { 'learning_rate': 0.031, 'max_depth': 10, 'subsample': 0.954, 'reg_lambda': 0.040, 'num_leaves': 210, 'colsample_bytree': 0.41, 'min_child_samples': 26 } # 验证集准确率:0.9142.3 XGBoost模型
GPU加速与参数调优策略:
xgb_params = { 'grow_policy': 'depthwise', 'n_estimators': 982, 'learning_rate': 0.05, 'gamma': 0.535, 'max_depth': 23, 'tree_method': 'gpu_hist' } # 最终CV得分:0.9162.4 CatBoost模型
类别特征原生处理与自动平衡:
CB = CatBoostClassifier( iterations=1000, learning_rate=0.138, depth=5, l2_leaf_reg=5.29, cat_features=categorical_columns, task_type='GPU' ) # 验证准确率:0.912模型性能对比表:
| 模型类型 | 验证准确率 | 训练时间(min) | 关键优势 |
|---|---|---|---|
| 随机森林 | 0.906 | 8.2 | 抗过拟合 |
| LGBM | 0.914 | 6.5 | 高效内存使用 |
| XGBoost | 0.916 | 7.8 | GPU加速 |
| CatBoost | 0.912 | 9.1 | 类别特征处理 |
3. 模型融合策略设计
3.1 加权平均法
通过网格搜索确定最优权重组合:
weight_combinations = [ {'rfc':0, 'lgbm':3, 'xgb':1, 'cat':0}, # 最佳组合 {'rfc':1, 'lgbm':2, 'xgb':1, 'cat':1}, {'rfc':0, 'lgbm':4, 'xgb':0, 'cat':0} ] # 融合预测计算 ensemble_pred = (weights['lgbm']*lgbm_pred + weights['xgb']*xgb_pred) / sum(weights.values())3.2 堆叠(Stacking)实现
使用逻辑回归作为元模型:
from sklearn.linear_model import LogisticRegression # 生成二级训练数据 stack_X = np.column_stack([val_rfc, val_lgbm, val_xgb, val_cat]) stack_y = train[TARGET].map(target_mapping) # 训练元模型 meta_model = LogisticRegression(multi_class='multinomial', solver='lbfgs') meta_model.fit(stack_X, stack_y)3.3 融合效果评估
不同策略的验证集表现:
| 融合方法 | 准确率 | F1-score | 排名提升 |
|---|---|---|---|
| 单模型(LGBM) | 0.914 | 0.912 | - |
| 加权平均 | 0.916 | 0.915 | +15% |
| 堆叠 | 0.918 | 0.917 | +22% |
混淆矩阵分析:
plt.figure(figsize=(10,8)) disp = ConfusionMatrixDisplay.from_predictions( y_true=true_labels, y_pred=ensemble_pred, display_labels=target_classes, normalize='true', cmap='Blues' ) plt.xticks(rotation=45)4. 工程化优化技巧
4.1 特征工程增强
- 非线性变换:年龄×身高、体重/身高³
- 分箱编码:将连续变量FAF、TUE离散化
- 交互特征:家族史与高热量食物消费的乘积项
4.2 交叉验证策略
使用分层K折保持类别分布:
skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)): X_train, X_val = X.iloc[train_idx], X.iloc[val_idx] y_train, y_val = y.iloc[train_idx], y.iloc[val_idx] # 各模型独立训练...4.3 计算效率优化
- 增量训练:LGBM的
save_binary参数加速数据加载 - 特征并行:CatBoost的
feature_weights配置 - 早停机制:XGBoost的
early_stopping_rounds=50
5. 竞赛总结与进阶建议
在实际提交中,加权融合方案使我们在Kaggle排行榜上达到了前1%的排名(34/3500+)。关键收获包括:
- 多样性优先:选择预测模式差异大的模型进行融合
- 权重调优:通过网格搜索验证不同权重组合
- 避免过拟合:在验证集上测试融合策略而非测试集
对于希望进一步提升的选手,可以尝试:
- 加入神经网络模型增加多样性
- 使用贝叶斯优化进行权重搜索
- 开发针对肥胖预测的领域特定特征
完整实现代码已封装为Kaggle Notebook,包含详细的注释和可复现的实验设置。在实际业务场景中,这种融合策略可应用于医疗风险评估、信用评分等需要高精度预测的领域。
