共计 1683 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
2019 泰迪杯数据挖掘 2024B 题是一个典型的时间序列预测问题,数据集包含多个维度的传感器读数、环境参数和操作记录。预测目标是根据历史数据,准确预测未来某个时间点的关键指标值。数据特点包括:

- 高维度:包含数十个原始特征
- 时序性:数据按时间顺序采集
- 不完整性:存在缺失值和异常值
- 非线性关系:特征与目标变量间存在复杂关联
技术选型
在对比了多种算法后,我们最终选择了 XGBoost 作为基础模型,主要基于以下考虑:
- XGBoost 对缺失值的鲁棒性优于传统算法
- 内置正则化项能有效防止过拟合
- 支持并行计算,训练效率高
- 在结构化数据上的表现通常优于神经网络
与 LightGBM 相比,XGBoost 在特征重要性分析方面更加直观,而且调参空间更灵活。
核心实现
特征工程
特征工程是提升模型性能的关键环节,我们实施了以下优化:
- 缺失值处理
- 连续变量采用滑动窗口均值填充
- 分类变量使用众数填充
-
保留缺失标志作为新特征
-
特征交叉
- 计算温度与湿度的交互项
-
生成设备状态与时间的组合特征
-
时序特征提取
- 计算滑动窗口统计量(均值、标准差)
- 提取周期性特征(小时、日、周)
- 构建滞后特征(前 1 /3/ 7 个时间点的值)
模型构建
XGBoost 的核心参数调优策略:
- 学习率 (eta):从 0.3 开始,逐步降低
- 最大深度 (max_depth):控制在 5 - 8 之间
- 子采样比例 (subsample):0.8-1.0
- 正则化参数 (lambda/alpha):根据验证集表现调整
代码示例
# 特征工程示例
import pandas as pd
from sklearn.preprocessing import StandardScaler
def feature_engineering(raw_data):
"""
特征处理主函数
:param raw_data: 原始数据 DataFrame
:return: 处理后的特征 DataFrame
"""
# 缺失值处理
df = raw_data.copy()
for col in df.columns:
if df[col].dtype == 'float64':
df[col] = df[col].fillna(df[col].rolling(5, min_periods=1).mean())
elif df[col].dtype == 'object':
df[col] = df[col].fillna(df[col].mode()[0])
# 时序特征
df['hour'] = df['timestamp'].dt.hour
df['day_of_week'] = df['timestamp'].dt.dayofweek
# 特征交叉
df['temp_humidity'] = df['temperature'] * df['humidity']
# 标准化
scaler = StandardScaler()
numeric_cols = df.select_dtypes(include=['float64']).columns
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])
return df
性能优化
我们采用了两阶段的优化策略:
- 粗粒度网格搜索
- 先大范围确定参数大致区间
-
固定其他参数,每次只调整 1 - 2 个参数
-
细粒度调优 + 早停法
- 在最优参数附近缩小搜索步长
- 设置早停轮数 (early_stopping_rounds=50)
- 监控验证集损失曲线
避坑指南
在项目过程中我们遇到的主要问题及解决方案:
- 数据泄露
- 错误:在特征工程中使用未来数据
-
解决:严格按时间顺序划分训练 / 验证集
-
过拟合
- 现象:训练集误差远低于验证集
-
方案:增加正则化项,减少树深度
-
特征冗余
- 问题:高度相关特征影响模型稳定性
- 处理:计算特征相关性矩阵,删除相关系数 >0.9 的特征
总结与延伸
本次实战验证了结构化特征工程 +XGBoost 在时序预测问题中的有效性。建议读者可以尝试以下改进方向:
- 引入注意力机制处理重要时间点
- 结合 Prophet 等专业时序模型
- 尝试 Transformer 架构提取长期依赖
- 部署在线学习机制适应数据分布变化
完整代码已开源在 GitHub,包含数据预处理、特征工程、模型训练和结果可视化全套流程,欢迎交流讨论。
正文完
发表至: 未分类
近两天内
