共计 2081 个字符,预计需要花费 6 分钟才能阅读完成。
赛题背景
26 年泰迪杯数据挖掘大赛 A 题聚焦金融风控场景,提供了包含用户交易记录、时间戳、金额、交易类型等字段的数据集。数据特点包括:

- 字段含义:包含 transaction_id(交易 ID)、user_id(用户 ID)、timestamp(时间戳)、amount(金额)、merchant_category(商户类别)等 20+ 维度
- 评估指标:以 AUC(Area Under Curve)作为主要评价标准,兼顾召回率(Recall)
- 核心挑战:欺诈交易占比不足 5%,存在严重的类别不平衡问题
技术选型对比
在金融风控场景下,我们对比了三种常见模型:
- 逻辑回归(Logistic Regression)
- 优点:模型简单、可解释性强
-
缺点:难以捕捉非线性关系,对特征工程要求高
-
随机森林(Random Forest)
- 优点:自动处理特征交互,抗过拟合能力强
-
缺点:训练速度慢,难以处理超大规模数据
-
XGBoost(eXtreme Gradient Boosting)
- 选择理由:
- 原生支持缺失值处理
- 提供特征重要性(feature_importance)输出
- 支持 GPU 加速训练
特征工程实战
# Python 3.8+ 必需库:pandas 1.3+, tsfresh 0.18+
import pandas as pd
from tsfresh import extract_features
# 构造时间窗口统计特征
def create_rolling_features(df):
"""
为每个用户生成过去 1h/24h 的交易统计
:param df: 原始交易 DataFrame
:return: 新增特征 DataFrame
"""return df.groupby('user_id').rolling('1h', on='timestamp').agg({'amount': ['mean','std','count'],'is_fraud':'sum' # 注意:线上预测时需移除该字段
})
# 使用 tsfresh 自动生成时序特征
tsfresh_features = extract_features(df[['user_id', 'timestamp', 'amount']],
column_id="user_id",
column_sort="timestamp"
)
# 金额 WOE 分箱(Weight of Evidence)from sklearn.preprocessing import KBinsDiscretizer
discretizer = KBinsDiscretizer(
n_bins=5,
encode='ordinal',
strategy='quantile'
)
df['amount_bin'] = discretizer.fit_transform(df[['amount']])
模型调优
关键超参数网格搜索范围:
| 参数 | 搜索范围 | 最优值 |
|---|---|---|
| max_depth | [3, 5, 7] | 5 |
| learning_rate | [0.01, 0.1, 0.3] | 0.1 |
| subsample | [0.6, 0.8, 1.0] | 0.8 |
| scale_pos_weight | [1, 10, 20] | 15 |
通过 5 折交叉验证得到的 AUC 变化曲线:
import matplotlib.pyplot as plt
plt.plot(cv_results['iterations'], cv_results['train-auc-mean'], label='Train')
plt.plot(cv_results['iterations'], cv_results['test-auc-mean'], label='Test')
plt.xlabel('Boosting Rounds')
plt.ylabel('AUC Score')
plt.legend()
避坑指南
- 内存优化:
- 使用
dtype={'amount': 'float32'}减少内存占用 -
分块读取大数据:
pd.read_csv('data.csv', chunksize=100000) -
类别不平衡处理:
from imblearn.over_sampling import SMOTE sm = SMOTE(sampling_strategy=0.3) X_res, y_res = sm.fit_resample(X_train, y_train) -
线上提交检查:
- 确保测试集特征与训练集完全一致
- 移除任何包含未来信息的特征(如基于 is_fraud 的统计)
- 检查特征维度是否匹配
延伸思考
- 实时风控迁移:
- 将特征工程模块封装为 API 服务
- 使用 XGBoost 的
predict_proba输出风险分数 -
考虑添加规则引擎作为第一道防线
-
新增用户画像处理:
- 对画像类别特征进行 Target Encoding
- 构造交叉特征(如 ” 高消费频率 + 深夜交易 ” 组合)
- 使用图神经网络挖掘用户关联关系
参赛心得
通过本次实战,深刻体会到金融风控场景中特征工程的重要性。建议选手们重点关注:
- 时序特征的构造方式(滑动窗口、周期统计等)
- 模型可解释性与业务需求的平衡
- 在有限算力下如何做高效的超参数搜索
代码仓库已开源在 GitHub(伪链接):github.com/example/tidydata26-solution
正文完
发表至: 未分类
近一天内
