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.906

2.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.914

2.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.916

2.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.9068.2抗过拟合
LGBM0.9146.5高效内存使用
XGBoost0.9167.8GPU加速
CatBoost0.9129.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.9140.912-
加权平均0.9160.915+15%
堆叠0.9180.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+)。关键收获包括:

  1. 多样性优先:选择预测模式差异大的模型进行融合
  2. 权重调优:通过网格搜索验证不同权重组合
  3. 避免过拟合:在验证集上测试融合策略而非测试集

对于希望进一步提升的选手,可以尝试:

  • 加入神经网络模型增加多样性
  • 使用贝叶斯优化进行权重搜索
  • 开发针对肥胖预测的领域特定特征

完整实现代码已封装为Kaggle Notebook,包含详细的注释和可复现的实验设置。在实际业务场景中,这种融合策略可应用于医疗风险评估、信用评分等需要高精度预测的领域。