共计 1850 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
2026 年泰迪杯 A 题的数据集是一个典型的结构化数据竞赛题目,数据规模约为 50 万条样本,包含 200+ 原始特征(混合数值型和类别型)。评价指标采用加权 F1-score,对少数类别的预测准确性有较高要求。数据存在显著特点:

- 高维度稀疏特征(部分特征缺失率超过 60%)
- 时间序列属性(数据按周采集,存在明显周期性)
- 类别不平衡(目标变量比例约为 7:2:1)
技术选型
特征提取方法对比
- PCA 降维 :适用于数值型特征,但会丢失可解释性。实测发现当保留 95% 方差时,线上得分反而下降 1.2%
- 手工特征 :基于业务理解构造的统计特征(如滚动窗口均值)效果显著,单个优秀手工特征可使模型提升 0.5%
模型对比实验
| 模型 | 耗时 (s) | 线下 F1 | 线上 F1 |
|---|---|---|---|
| XGBoost | 218 | 0.812 | 0.798 |
| LightGBM | 156 | 0.826 | 0.809 |
| CatBoost | 302 | 0.819 | 0.803 |
最终选择 LightGBM 作为基模型,因其在训练速度和效果上取得最佳平衡。
核心实现
特征工程 Pipeline
# 缺失值处理(不同策略组合)num_imputer = SimpleImputer(strategy='median')
cat_imputer = SimpleImputer(strategy='constant', fill_value='MISSING')
# 分箱处理(针对年龄特征)age_bins = KBinsDiscretizer(
n_bins=5,
encode='ordinal',
strategy='quantile')
# 时间特征扩展
def extract_date_features(df):
df['day_of_week'] = df['timestamp'].dt.dayofweek
df['is_weekend'] = (df['day_of_week'] >= 5).astype(int)
return df
模型融合策略
采用双层 Stacking 架构:
- 第一层:3 个 LightGBM(不同参数)、1 个 CatBoost、1 个线性模型
- 第二层:逻辑回归作为元模型
关键技巧:
– 使用 5 折时间序列交叉验证(TimeSeriesSplit)防止数据泄露
– 对第二层输入添加第一层模型的预测概率作为新特征
性能优化
调参方法对比
| 方法 | 迭代次数 | 最佳 F1 | 耗时 (h) |
|---|---|---|---|
| 网格搜索 | 50 | 0.821 | 4.2 |
| 贝叶斯优化 | 30 | 0.827 | 2.1 |
推荐使用 Optuna 进行超参搜索,示例代码如下:
def objective(trial):
params = {'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'num_leaves': trial.suggest_int('num_leaves', 20, 300),
'min_child_samples': trial.suggest_int('min_child_samples', 5, 100)
}
model = LGBMClassifier(**params)
scores = cross_val_score(model, X, y, cv=5, scoring='f1_weighted')
return scores.mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=30)
避坑指南
类别不平衡处理
- 调整 class_weight 参数(效果优于过采样)
- 使用 Focal Loss 损失函数(线上提升 0.3%)
内存优化
- 使用 category 类型处理字符串特征(内存减少 70%)
for col in cat_cols: df[col] = df[col].astype('category')
结果校验
- 检查预测概率和为 1(常见错误:忘记 softmax)
- 验证时间字段格式(需与测试集完全一致)
延伸思考
- 当遇到概念漂移(concept drift)时,如何动态更新模型?
- 对于极度稀疏的特征(如出现率 <0.1%),有哪些处理方法?
- 如何设计一个自动化特征生成框架来替代手工特征工程?
实战总结
通过系统性的特征工程和模型融合,我们最终在测试集上达到了 0.823 的加权 F1-score。关键发现是:
- 时间序列特征(如历史滑动窗口统计量)比原始特征更重要
- 适度的特征筛选(删除重要性 <0.01 的特征)能提升模型鲁棒性
- 模型融合带来的增益随着基模型多样性增加而提高
完整代码已开源在 GitHub(伪代码已做脱敏处理),包含可复用的特征工程模板和自动化调参模块。
正文完
