共计 2265 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
参加泰迪杯数据挖掘竞赛时,我们经常会遇到几类典型问题:

- 缺失值分布复杂 :某些特征列缺失率高达 30%,直接删除会导致信息损失,简单填充可能引入偏差
- 类别不平衡严重 :目标变量中正负样本比例可能达到 1:10,常规评估指标如 Accuracy 完全失效
- 时序特征处理困难 :包含日期时间字段时,需要提取周期特征(星期、节假日等)而不破坏时间依赖性
技术选型
在集成学习算法中,我们对比了三大主流框架:
- XGBoost:
- 优势:正则化完善,防止过拟合能力强;支持自定义损失函数
- 不足:内存消耗较大
- LightGBM:
- 优势:训练速度最快,适合大数据量
- 不足:对小数据集容易过拟合
- CatBoost:
- 优势:自动处理类别特征,无需编码
- 不足:调参复杂度高
最终选择 XGBoost 因为:
– 泰迪杯数据集通常规模适中(10 万行以内)
– 竞赛更关注模型稳定性而非纯速度
核心实现
自动化特征生成
使用 FeatureTools 进行特征自动化构建:
import featuretools as ft
# 创建实体集
es = ft.EntitySet(id='泰迪杯数据')
# 添加数据帧
es = es.add_dataframe(
dataframe_name='main',
dataframe=data,
index='id',
time_index='date'
)
# 自动生成特征
feature_matrix, features = ft.dfs(
entityset=es,
target_dataframe_name='main',
max_depth=2
)
特征重要性筛选
基于 SHAP 值进行特征筛选:
import shap
# 计算 SHAP 值
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 可视化
shap.summary_plot(shap_values, X_test)
# 筛选重要性 >0.01 的特征
important_features = [
col for col in X.columns
if abs(shap_values[:,i].mean()) > 0.01
]
类别特征编码优化
使用 Target Encoding 并防止数据泄露:
from category_encoders import TargetEncoder
from sklearn.model_selection import KFold
# 创建 5 折编码
kf = KFold(n_splits=5)
encoded_col = np.zeros_like(df['category_col'])
for train_idx, val_idx in kf.split(df):
# 注意只在训练集上拟合
encoder = TargetEncoder()
encoder.fit(df.iloc[train_idx]['category_col'],
df.iloc[train_idx]['target']
)
# 转换验证集
encoded_col[val_idx] = encoder.transform(df.iloc[val_idx]['category_col']
)
性能优化
早停法配置
xgb_params = {
'early_stopping_rounds': 50, # 连续 50 轮无提升则停止
'eval_metric': 'auc', # 监控指标
'eval_set': [(X_val, y_val)] # 验证数据集
}
GPU 加速
params = {
'tree_method': 'gpu_hist', # 使用 GPU 加速
'predictor': 'gpu_predictor',
'n_jobs': -1 # 使用所有 CPU 核心
}
避坑指南
检测数据分布漂移
from scipy import stats
# 对数值特征进行 KS 检验
for col in numeric_cols:
_, p_value = stats.ks_2samp(train[col], test[col]
)
if p_value < 0.01:
print(f"{col} 存在分布漂移")
防止过拟合策略
from sklearn.model_selection import StratifiedKFold
# 分层 5 折交叉验证
skf = StratifiedKFold(n_splits=5)
for train_idx, val_idx in skf.split(X, y):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# 在每折上重新训练模型
model.fit(X_train, y_train)
延伸思考
工业级迁移建议
- 增加数据质量监控模块
- 用 Flask/FastAPI 封装模型 API
- 添加特征版本管理
优化方向
- AutoML 应用 :尝试 H2O.ai 或 TPOT 自动优化
- 模型融合 :XGBoost+ 神经网络混合架构
- 在线学习 :对时序数据实现增量训练
实践体会
通过本次方案实现,最大的收获是建立了特征工程的系统性思维。特别是在处理类别特征时,Target Encoding 配合交叉验证的策略,相比简单的 One-Hot Encoding 能提升 3 -5% 的 AUC 分数。另外发现 SHAP 值解释性工具不仅可用于特征筛选,还能帮助理解模型决策逻辑,这对竞赛答辩环节非常有帮助。
建议参赛者重点关注数据理解阶段,花时间分析特征分布和缺失模式,这往往比盲目调参更有效。代码模板中的技术点可以根据具体赛题灵活调整,比如对图像赛题可以加入 CNN 特征提取模块。
正文完
发表至: 未分类
近两天内
