共计 1116 个字符,预计需要花费 3 分钟才能阅读完成。
背景与痛点
数据挖掘竞赛往往面临数据质量差、特征维度高、样本不平衡等挑战。13 届泰迪杯赛题聚焦于金融风控领域,要求参赛者基于用户交易行为数据构建反欺诈模型。原始数据包含数百万条交易记录,涉及数十个特征字段,主要痛点包括:

- 数据缺失严重:部分关键字段缺失率超过 30%
- 类别不平衡:欺诈样本占比不足 1%
- 特征相关性弱:原始特征与目标变量的皮尔逊系数普遍低于 0.1
技术选型对比
数据预处理方案
- 缺失值处理
- 均值填充:计算简单但可能引入偏差
- 模型预测填充:使用 KNN 或随机森林预测缺失值,精度更高但耗时
-
特殊值标记:将缺失作为独立类别,适合类别型特征
-
异常值检测
- 3σ 原则:对正态分布数据有效
- IQR 方法:适用于非正态分布
- 孤立森林:能识别高维空间异常点
模型选择
| 模型 | 优点 | 缺点 |
|---|---|---|
| XGBoost | 正则化防止过拟合 | 超参数较多 |
| LightGBM | 训练速度快 | 对小数据集可能欠拟合 |
| CatBoost | 自动处理类别特征 | 内存消耗较大 |
核心实现细节
数据清洗(Python 示例)
# 处理缺失值
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
data_imputed = imputer.fit_transform(raw_data)
# 异常值修正
Q1 = data['amount'].quantile(0.25)
Q3 = data['amount'].quantile(0.75)
data.loc[data['amount'] > Q3+1.5*(Q3-Q1), 'amount'] = Q3
特征工程关键步骤
- 时间特征衍生:提取交易小时、星期几等时序特征
- 交叉特征构建:将用户 ID 与交易类型组合统计
- 目标编码:对高基数类别特征进行均值编码
模型训练与调优
import lightgbm as lgb
params = {
'objective': 'binary',
'metric': 'auc',
'num_leaves': 31,
'learning_rate': 0.05
}
train_data = lgb.Dataset(X_train, label=y_train)
model = lgb.train(params, train_data, num_boost_round=500)
性能优化
通过特征重要性排序(如图)筛选 TOP30 特征后:
| 方案 | AUC | 训练时间 |
|---|---|---|
| 原始特征 | 0.812 | 45min |
| 优化后特征 | 0.827 | 28min |
避坑指南
- 数据泄露 :避免在预处理时使用全量数据统计量
- 过拟合 :早停法 + 交叉验证双重保障
- 评估偏差 :采用 P - R 曲线辅助 AUC 指标
思考与讨论
当前方案对类别不平衡的处理采用简单的欠采样,如果尝试 SMOTE 过采样或代价敏感学习,可能带来哪些改进?欢迎在评论区分享你的实验效果。
正文完
发表至: 未分类
近两天内
