共计 2394 个字符,预计需要花费 6 分钟才能阅读完成。
赛题背景与数据集特点
2025 年泰迪杯 B 题以电商用户行为预测为主题,数据集包含 300 万条用户浏览记录,主要字段包括:
– 用户 ID(脱敏处理)
– 商品类目(三级分类编码)
– 停留时长(秒)
– 操作类型(点击 / 收藏 / 加购)
– 时间戳(精确到分钟)

数据集特点分析:
- 高维度稀疏性:商品类目字段包含 2000+ 唯一值
- 时间序列特性:用户行为具有明显的时间模式
- 样本不平衡:付费转化率仅 1.2%
数据预处理关键步骤
缺失值处理
# 检查缺失比例
missing_ratio = df.isnull().sum() / len(df)
# 处理方案:# 1. 数值型字段用中位数填充
# 2. 类别型字段用 'UNKNOWN' 标记
df['stay_duration'] = df['stay_duration'].fillna(df['stay_duration'].median())
df['category'] = df['category'].fillna('UNKNOWN')
异常值检测
# 基于 IQR 方法检测停留时长异常值
Q1 = df['stay_duration'].quantile(0.25)
Q3 = df['stay_duration'].quantile(0.75)
IQR = Q3 - Q1
# 定义异常值边界
df = df[~((df['stay_duration'] < (Q1 - 1.5 * IQR)) |
(df['stay_duration'] > (Q3 + 1.5 * IQR)))]
特征工程方法对比
PCA 降维 vs 手工特征构建
| 方法 | 优点 | 缺点 |
|---|---|---|
| PCA | 自动提取特征,适合高维数据 | 可解释性差 |
| 手工构建 | 业务可解释性强 | 需要领域知识,耗时较长 |
推荐组合策略:
- 先用 PCA 压缩商品类目维度(3000 维→50 维)
- 再手工构建关键特征:
- 用户历史转化率
- 最近 7 天活跃度
- 类目偏好指数
# 手工特征示例:用户活跃度
df['active_days'] = df.groupby('user_id')['timestamp'].nunique()
完整建模流程代码
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# 特征处理管道
numeric_features = ['stay_duration', 'active_days']
categorical_features = ['category_level1']
preprocessor = ColumnTransformer(
transformers=[('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])
# 完整 Pipeline
pipeline = Pipeline([('preprocessor', preprocessor),
('classifier', xgb.XGBClassifier(
n_estimators=200,
max_depth=5,
learning_rate=0.1,
scale_pos_weight=80 # 处理样本不平衡
))
])
# 5 折交叉验证
cv_scores = cross_val_score(pipeline, X, y, cv=5, scoring='roc_auc')
print(f"平均 AUC: {cv_scores.mean():.4f}")
XGBoost 调参技巧
关键参数优化顺序:
- 学习率(0.01-0.3)和树数量(100-1000)
- 最大深度(3-10)和最小子样本权重(1-10)
- 子采样比例(0.5-1.0)和特征采样比例(0.5-1.0)
推荐使用 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, 10),
'subsample': trial.suggest_float('subsample', 0.5, 1.0)
}
model = xgb.XGBClassifier(**params)
return cross_val_score(model, X, y, cv=3, scoring='roc_auc').mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
避坑指南
常见问题及解决方案:
- 内存溢出问题:
- 使用稀疏矩阵存储 one-hot 编码
-
分批处理大数据(chunksize=100000)
-
过拟合问题:
- 增加 early_stopping_rounds
-
使用 StratifiedKFold 保证数据分布
-
特征泄露:
- 严格区分训练 / 验证时间窗口
- 避免使用未来信息
延伸思考
- 如何利用用户行为序列信息(LSTM/Transformer)?
- 冷启动用户该如何处理(协同过滤 vs 内容推荐)?
- 当新增实时数据流时,如何设计在线学习方案?
测试环境说明
- CPU: Intel i7-12700K
- RAM: 32GB DDR4
- Python: 3.9.12
- 主要库版本:
- pandas 1.4.3
- scikit-learn 1.1.1
- xgboost 1.6.1
实战建议
对于时间有限的参赛团队,建议优先实现:
- 基础特征工程(30% 时间)
- 快速原型验证(40% 时间)
- 模型集成与调优(30% 时间)
记得每天备份代码和实验结果,最后 24 小时重点做模型融合和报告撰写。祝各位取得好成绩!
正文完
发表至: 未分类
近两天内
