赛题理解与数据分析
一、结构化竞赛的通用解题流程
| 维度 | 说明 |
|---|---|
| 标准流程 | 赛题理解 → 数据分析 → 特征工程 → 模型构建 → 验证打分 → 模型集成 |
| 初期策略 | 比赛初期先把完整路线走通,能够成功提交,了解比赛全貌后再深入每个细节 |
| 重要性分配 | 数据理解与特征工程占50%,模型集成占30%,模型与超参数调优占20% |
| 核心原则 | 结构化比赛对计算资源友好,CPU即可运行,适合入门学习 |
二、匿名数据的分析方法
| 维度 | 说明 |
|---|---|
| 匿名含义 | 字段含义未给出,但字段本身仍有内容和规律,需要根据分布和属性进行分析 |
| 分析维度 | 字段自身分布、字段与标签的分布关系、字段属性(如时间窗口、指标类型) |
| 相关性分析 | 找到相关性后,可将多个字段组合进行联合分析,构造新特征 |
| 特征分组 | 匿名特征可能成组出现,不同组的编码方式和特征提取方式可能不同,需分类处理 |
三、时间字段与周期分析
| 维度 | 说明 |
|---|---|
| Date字段 | 表示第几天,训练集中通常从0到499取值,500天约等于两年的工作日周期(250天/年) |
| Tsid字段 | 表示具体时间的次序,是累计值而非每天清零,可用于反推原始日期 |
| 日期反推价值 | 若能反推具体日期,可分析节假日、特殊事件对交易的影响 |
| 趋势突变点 | 按Date分组统计特征均值,可能发现某个时间节点前后走势完全不同(如第85天),需决定是否剔除突变前数据 |
| 交易机会密度 | 按天统计交易机会数量,可判断数据粒度(秒级/分钟级),大部分交易日机会数介于2500到5000之间 |
四、Response字段与多标签训练
| 维度 | 说明 |
|---|---|
| Response字段 | 通常有多个(如response_1到response_4及最终response),分别表示不同时间维度的收益 |
| 仅训练集可用 | Response字段只在训练集中出现,测试集中没有 |
| 多标签训练 | 可同时对多个Response字段进行分类训练,相当于增加正则化,稳定模型表现 |
| Loss权重调节 | 不同时间维度的Response重要性不同,可尝试为不同Response分配不同的Loss权重 |
| 相关性注意 | 不同时间维度的Response相关性较大,但并非简单求和关系 |
五、Weight字段与评分逻辑
| 维度 | 说明 |
|---|---|
| 评分公式 | 最终得分 = sum(weight_i * response_i * action_i) / sqrt(sum(weight_i^2)),平摊到每年(除以sqrt(250)) |
| Weight含义 | 可理解为仓位比例或交易金额,训练集和测试集中都包含 |
| Weight为零的处理 | Weight为零时收益为零,训练时可筛选Weight非零的样本参与训练 |
| Weight与Response分离 | 不建议将Weight和Response简单相乘后预测 |
| Action决策 | Response为正时Action应为1(买入/持有),Response为负时Action应为0(卖出/空仓) |
六、特征元数据(features.csv)的利用
| 维度 | 说明 |
|---|---|
| Tag标签体系 | features.csv为每个特征打了Tag标签,相当于One-Hot编码 |
| 特征分类 | 根据Tag可将130个特征分类,理解哪些特征相关、哪些可组合构造新特征 |
| 时间窗口Tag | 区分特征描述的是过去1天、10天还是30天的信息 |
| 指标类型Tag | 区分特征是否与volume、price等指标相关 |
| 构造新特征 | 基于Tag分类,可对同组特征进行交叉、聚合等操作构造新特征 |
七、数据理解的核心要点
| 维度 | 说明 |
|---|---|
| 每条记录含义 | 训练集每行代表一次交易机会,而非某只股票的固定时序记录 |
| 多股票混合 | 数据集可能包含市场上所有股票触发了交易规则的时刻 |
| Feature_0假设 | 特征0有可能是买入/卖出方向的标志 |
| 策略已触发 | 比赛数据集本质是量化公司的交易系统已触发了策略,选手只需判断具体交易动作 |
| 未来收益预测 | Response往往是用未来一段时间的收益来计算,而非过去 |
八、时间序列预测的分类维度
| 维度 | 说明 |
|---|---|
| 按变量数 | 单变量(仅预测一个序列)vs 多变量(同时预测多个相关序列);多变量可拆分为多个单变量问题分别建模 |
| 按预测步长 | 单步预测(仅预测下一个时间点)vs 多步预测(预测未来多个时间点);多步预测常用递归策略或直接多输出策略 |
| 按序列数量 | 单序列 vs 多序列(成千上万条序列);多序列场景下数据预处理非常繁杂 |
| 按预测类型 | 点预测(输出单一值)vs 区间预测(输出置信区间) |
| 变量类型 | 动态变量(随时间变化)vs 静态变量(不随时间变化);DNN模型中需将静态和动态数据分开输入 |
九、时间序列数据的成分分解
| 维度 | 说明 |
|---|---|
| 固有值(Level) | 序列数据本身的数据大小程度;可通过历史中位数或鲁棒性均值衡量 |
| 趋势性(Trend) | 随时间变化的序列变化模式,可为线性或非线性的增加/减少行为;是时间序列预测最大的难题之一 |
| 季节性(Seasonality) | 序列数据随时间变化的重复模式或周期行为,如周度/月度/季度的周期规律 |
| 周期性(Cycle) | 发生频率低于季节性波动,且没有固定变化周期,如经济周期 |
| 噪声(Noise) | 模型无法解释的残差部分 |
| 注意事项 | 并非所有时间序列都同时存在趋势性、周期性和季节性 |
十、GBT模型对趋势性的捕获局限
| 维度 | 说明 |
|---|---|
| 核心问题 | GBT(LightGBM/XGBoost/CatBoost)对季节性捕获能力强,但对趋势性捕获能力极差 |
| 根本原因 | GBT的预测本质是叶节点梯度的求和,预测值无法超出训练数据的取值范围 |
| 影响 | 当未来数据存在持续增长趋势时,GBT预测会出现系统性低估 |
| 解决方案 | (1) 线性回归拟合趋势,残差再用GBT拟合;(2) 移动平均/中位数模型拟合趋势后残差用NN拟合;(3) 直接使用NN模型 |
十一、Offset+Log变换(时序数据标准化)
| 维度 | 说明 |
|---|---|
| 问题背景 | 多序列时间序列数据中,不同序列的量纲差异极大 |
| 核心方法 | log(1 + offset * x),其中offset为放缩系数(如0.5) |
| 与log1p的区别 | log1p是 log(1 + x),offset+log引入了可调的放缩系数 |
| 代码示例 | train_log = np.log1p(offset * train_raw),预测还原:pred = np.expm1(pred_log) / offset |
| 核心优势 | 通过调整offset参数,可灵活控制不同序列间量纲差异的压缩程度 |
十二、固有值去除(时序数据去量纲)
| 维度 | 说明 |
|---|---|
| 核心思想 | 在offset+log变换之后,减去每个序列的历史中位数,去除序列的固有值 |
| 实现方式 | train_normalized = train_log - median_per_series |
| 预测还原 | pred_log = pred_normalized + median_per_series,再通过 np.expm1() 和除以offset还原 |
| 核心优势 | 将不同量纲序列的差异压缩到极小范围,使模型更容易学习到波动模式而非绝对大小 |
十三、SMAPE评价指标
| 维度 | 说明 |
|---|---|
| 公式 | SMAPE = (2/n) * Σ |
| 与MAE/MAPE的关系 | MAE是无界指标;MAPE有缺陷;SMAPE针对MAPE的缺陷设计,更加鲁棒 |
| 除零处理 | 当真实值和预测值均为0时分母为0,Kaggle Web Traffic比赛的处理方式是直接取0 |
| 值域 | 0%~200%,值越小越好 |