Kaggle 多分类特征工程:从BMI衍生到类别编码,提升模型性能 3%
📅 2026/7/9 6:32:25
👁️ 阅读次数
📝 编程学习
Kaggle多分类竞赛中的特征工程实战:从BMI衍生到类别编码的3%性能提升
在数据科学竞赛中,特征工程往往是决定模型性能上限的关键因素。本文将以Kaggle肥胖风险预测竞赛为例,系统讲解如何通过特征衍生、类别编码等技术手段,在结构化数据竞赛中实现模型性能的实质性提升。
1. 竞赛背景与数据理解
肥胖风险预测竞赛(Multi-Class Prediction of Obesity Risk)是Kaggle Playground系列中的经典多分类问题。数据集包含18个特征字段和7个肥胖风险等级标签,任务是根据个体的生理指标、生活习惯等特征预测其肥胖风险类别。
原始数据字段包括:
- 数值型特征:年龄、身高、体重、蔬菜消费频率等
- 类别型特征:性别、家族肥胖史、高热量食物消费频率等
- 目标变量:7级肥胖分类(从体重不足到III级肥胖)
通过初步探索性分析(EDA),我们发现几个关键洞察:
- 性别与肥胖类型存在强关联(如II型肥胖患者全为男性)
- 身高体重呈现明显的聚类特征
- 饮食和生活习惯特征与目标变量存在非线性关系
# 数据概览示例 import pandas as pd train = pd.read_csv("train.csv") print(train.describe()) # 目标变量分布可视化 import seaborn as sns sns.countplot(x='NObeyesdad', data=train)2. 核心特征工程策略
2.1 基于领域知识的特征衍生
在医疗健康领域,BMI(身体质量指数)是评估肥胖程度的核心指标。我们通过原始数据中的身高体重字段计算BMI值:
def extract_features(df): df['BMI'] = df['Weight'] / (df['Height']**2) return df进一步,我们可以基于BMI进行更精细的特征工程:
- BMI分级:根据WHO标准划分肥胖等级
- BMI异常标志:标记BMI与年龄不匹配的异常情况
- 体型指数:结合身高体重的非线性组合
# BMI衍生特征示例 def bmi_features(df): df['BMI_Class'] = pd.cut(df['BMI'], bins=[0,18.5,25,30,35,40,100], labels=[0,1,2,3,4,5]) df['BMI_Abnormal'] = ((df['Age']<30) & (df['BMI']>30)).astype(int) df['Body_Index'] = df['Weight']/(df['Height']**1.5) return df2.2 类别型特征编码策略
针对类别型特征,我们对比了多种编码方式的性能表现:
| 编码方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| One-Hot | 低基数特征 | 无信息损失 | 维度爆炸 |
| Label Encoding | 树模型 | 保持维度 | 引入虚假顺序 |
| Target Encoding | 高基数特征 | 捕获类别与目标关系 | 容易过拟合 |
| M-Estimate Encoding | 中小规模数据 | 平衡先验与观测 | 需要调参 |
最终采用MEstimateEncoder处理高基数类别变量:
from category_encoders import MEstimateEncoder encoder = MEstimateEncoder(cols=['CAEC','CALC','MTRANS'], m=5.0) train_encoded = encoder.fit_transform(train, train['NObeyesdad'])2.3 特征交互与组合
通过特征交叉发现更有预测力的新特征:
- 饮食模式指标:结合高热量食物消费与蔬菜消费
- 运动热量平衡:体育活动频率与热量监控的组合
- 家族史强化特征:家族肥胖史与个人指标的交互
def interaction_features(df): df['Diet_Score'] = df['FAVC'].map({'yes':1, 'no':0}) * df['FCVC'] df['Exercise_Effect'] = df['FAF'] / (df['TUE'] + 1e-5) df['Family_Risk'] = df['family_history_with_overweight'].map({'yes':1, 'no':0}) * df['BMI'] return df3. 特征选择与评估
3.1 特征重要性分析
使用随机森林和XGBoost评估特征重要性,筛选Top20特征:
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier() rf.fit(X_train, y_train) # 特征重要性可视化 feat_importances = pd.Series(rf.feature_importances_, index=X_train.columns) feat_importances.nlargest(20).plot(kind='barh')3.2 特征组合效果验证
通过交叉验证对比不同特征组合的效果:
| 特征组合 | 验证集准确率 | 提升幅度 |
|---|---|---|
| 原始特征 | 0.887 | Baseline |
| +BMI衍生 | 0.902 | +1.5% |
| +类别编码 | 0.911 | +2.4% |
| +交互特征 | 0.917 | +3.0% |
提示:特征工程效果评估应采用交叉验证,避免数据泄露导致的评估偏差
4. 模型集成与优化
4.1 多模型对比
我们测试了四种主流算法的表现:
from lightgbm import LGBMClassifier from xgboost import XGBClassifier from catboost import CatBoostClassifier models = { 'RandomForest': RandomForestClassifier(), 'LightGBM': LGBMClassifier(), 'XGBoost': XGBClassifier(), 'CatBoost': CatBoostClassifier(verbose=False) } for name, model in models.items(): scores = cross_val_score(model, X, y, cv=5) print(f"{name}: {scores.mean():.4f} (±{scores.std():.4f})")4.2 超参数优化
以LightGBM为例,使用Optuna进行超参数搜索:
import optuna def objective(trial): params = { 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3), 'max_depth': trial.suggest_int('max_depth', 3, 15), 'num_leaves': trial.suggest_int('num_leaves', 15, 1000), 'min_child_samples': trial.suggest_int('min_child_samples', 10, 100) } model = LGBMClassifier(**params) return cross_val_score(model, X, y, cv=5).mean() study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=50)4.3 模型融合策略
采用加权平均法融合多个模型的预测结果:
# 定义模型权重 weights = {'rf':0.1, 'lgbm':0.6, 'xgb':0.2, 'cat':0.1} # 生成融合预测 ensemble_pred = (weights['rf']*rf_pred + weights['lgbm']*lgbm_pred + weights['xgb']*xgb_pred + weights['cat']*cat_pred)5. 竞赛实践建议
- 特征工程迭代:建议采用"生成-评估-筛选"的循环流程,持续优化特征组合
- 避免数据泄露:所有特征工程步骤都应放在交叉验证循环内部
- 模型诊断:通过混淆矩阵分析各类别的预测表现,针对性改进
- 资源分配:将70%时间用于特征工程,30%用于模型调参
# 混淆矩阵分析 from sklearn.metrics import ConfusionMatrixDisplay ConfusionMatrixDisplay.from_predictions(y_true, y_pred, normalize='true', cmap='Blues')在实际竞赛中,这套特征工程方案使我们的模型性能从基线0.887提升到0.917,实现了3%的实质性提升。这个案例证明,在结构化数据问题中,精心设计的特征工程往往比复杂的模型结构更能带来性能突破。
编程学习
技术分享
实战经验