共计 1420 个字符,预计需要花费 4 分钟才能阅读完成。
赛题背景
2026 年泰迪杯数据挖掘竞赛的赛题聚焦于某电商平台的用户购买行为预测,数据集包含约 50 万条用户行为记录,涵盖点击、加购、下单等多类事件。核心挑战在于:

- 高维稀疏特征:用户 ID、商品类目等字段基数大且分布长尾
- 评估指标特殊:采用 F1-score@Top100(预测最可能下单的 100 个用户)
- 数据不均衡:正样本(下单用户)占比仅 1.2%
技术选型
通过对比实验发现:
- XGBoost:在特征重要性排序任务中表现稳定,支持自定义损失函数
- CatBoost:自动处理类别特征但内存消耗较大
- 神经网络:对时序建模能力强但训练时间过长
最终选择 XGBoost 的核心原因:
- 内置
scale_pos_weight参数可有效应对样本不均衡 - 支持 GPU 加速和特征重要性输出
- 比赛历史中 80% 获胜方案基于树模型
特征工程
缺失值处理
# 数值型用中位数填充,类别型用众数
num_cols = df.select_dtypes(include=['float64']).columns
cat_cols = df.select_dtypes(include=['object']).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode().iloc[0])
时序特征构造
# 计算用户最近 3 /7/15 天行为次数
df['3day_click_count'] = df.groupby('user_id')['click_time']\
.transform(lambda x: x[x > (x.max()-pd.Timedelta(days=3))].count())
特征分箱
# 对年龄进行等频分箱
df['age_bin'] = pd.qcut(df['age'], q=5, labels=False)
模型优化
早停法实现
xgb_params = {
'objective': 'binary:logistic',
'eval_metric': 'auc'
}
eval_set = [(X_val, y_val)]
model = xgb.train(params=xgb_params,
dtrain=xgb.DMatrix(X_train, y_train),
early_stopping_rounds=50,
evals=eval_set)
贝叶斯调参
from skopt import BayesSearchCV
search_space = {'max_depth': (3, 10),
'learning_rate': (0.01, 0.3),
'subsample': (0.5, 1.0)
}
bayes = BayesSearchCV(estimator=xgb.XGBClassifier(),
search_spaces=search_space,
n_iter=30)
避坑指南
- 过拟合问题:
- 使用
min_child_weight控制叶子节点样本量 - 添加
colsample_bytree约束特征采样 - 内存泄漏:
- 定期执行
gc.collect() - 避免在循环中创建 DataFrame
性能验证
| 特征组合 | AUC | F1@100 |
|---|---|---|
| 基础特征 | 0.812 | 0.45 |
| + 时序特征 | 0.834 | 0.52 |
| + 特征交叉 | 0.847 | 0.58 |
优化方向
- 引入 Graph Embedding 处理用户 - 商品关系
- 测试 Transformer 特征编码器
- 探索半监督学习利用未标注数据
正文完
发表至: 未分类
近两天内
