共计 1819 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点分析
在数据挖掘竞赛中,参赛者常遇到几个典型问题:

- 数据不平衡:分类任务中正负样本比例悬殊(如 1:10),导致模型偏向多数类
- 特征冗余:人工构造的数百维特征中存在高度相关性(如相关系数 >0.9),拖慢训练速度
- 过拟合:在验证集表现良好但测试集骤降,常见于复杂模型 + 小数据场景
- 时序依赖:传统方法忽略时间连续性,直接套用静态特征导致信息损失
技术方案详解
1. 数据预处理
缺失值处理
- 数值型:采用中位数填充(对异常值鲁棒)
- 类别型:单独标记为『UNKNOWN』类别
# 示例:中位数填充
num_cols = df.select_dtypes(include=['float64']).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
异常值检测
采用 IQR 方法自动识别:
- 计算 Q1(25 分位)、Q3(75 分位)
- 定义异常值范围:< Q1-1.5IQR 或 > Q3+1.5IQR
- 用分位数边界值截断处理
2. 特征工程(时序场景)
滑动窗口统计
- 过去 7 天均值 / 标准差(捕捉短期趋势)
- 滚动最大值 / 最小值(识别极端波动)
# 构建 7 天滑动窗口特征
df['rolling_mean_7'] = df['value'].rolling(window=7).mean()
df['rolling_std_7'] = df['value'].rolling(window=7).std()
周期特征构造
- 小时 / 星期几的 sin-cos 编码(处理循环特性)
- 同时间段历史对比(如同比上周同时段)
# 星期几的周期编码
df['week_sin'] = np.sin(2 * np.pi * df['day_of_week']/7)
df['week_cos'] = np.cos(2 * np.pi * df['day_of_week']/7)
3. 模型构建(XGBoost)
关键参数解析
params = {
'objective': 'binary:logistic', # 二分类任务
'n_estimators': 500,
'max_depth': 6, # 控制模型复杂度
'learning_rate': 0.05, # 配合早停使用
'subsample': 0.8, # 行采样防过拟合
'colsample_bytree': 0.7, # 列采样
'gamma': 0.1, # 分裂最小增益
'eval_metric': 'auc'
}
完整代码示例
# 数据加载
import pandas as pd
df = pd.read_csv('competition_data.csv')
# 时序特征构造
def create_time_features(df):
df['hour'] = df['timestamp'].dt.hour
df['day_of_week'] = df['timestamp'].dt.dayofweek
# 添加滑动窗口统计...
return df
# 训练管道
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(features, target, test_size=0.2, shuffle=False) # 时序数据禁止随机打乱
model = XGBClassifier(**params)
model.fit(X_train, y_train,
eval_set=[(X_val, y_val)],
early_stopping_rounds=50)
避坑指南
内存优化
- 使用
category类型存储低基数特征 - 稀疏矩阵存储 one-hot 编码结果
df['category_col'] = df['category_col'].astype('category')
交叉验证
- 时序数据需用 TimeSeriesSplit
- 避免未来信息泄漏(特征构造后再拆分)
模型融合
- 差异化工重要(如 XGBoost+LightGBM+CatBoost 组合)
- 避免简单平均(可尝试 Stacking)
性能对比
| 特征组合 | AUC | 训练时间 |
|---|---|---|
| 基础特征 | 0.72 | 1.2min |
| + 滑动窗口 | 0.78 | 2.5min |
| + 周期编码 | 0.81 | 3.1min |
| 全部特征 + 特征选择 | 0.83 | 2.8min |
开放思考题
- 当 SHAP 值与特征重要性排序冲突时,应以哪个为准?
- 如何设计自动化流程评估新构造特征的有效性?
- 在有限算力下,应优先增加数据量还是模型复杂度?
正文完
发表至: 未分类
近两天内
