🏠 总目录📚 本教程 13 · 赛题理解与数据分析
📑 本页目录(点开跳转)

赛题理解与数据分析

30 分钟 | ⭐⭐ 时序/结构化赛的第一步


🎯 一句话

结构化竞赛里,最快拉开差距的从来不是模型,是「你比别人更早看懂这份数据是什么」。这一章讲的就是那套看数据的方法——尤其是面对匿名特征时怎么反推它们的含义,以及时间字段里藏着的信息和陷阱


一、结构化竞赛的通用解题流程

维度 说明
标准流程 赛题理解 → 数据分析 → 特征工程 → 模型构建 → 验证打分 → 模型集成
初期策略 比赛初期先把完整路线走通,能够成功提交,了解比赛全貌后再深入每个细节
重要性分配 数据理解与特征工程占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%,值越小越好

🔗 这一章连到哪里

去哪为什么
ML基础 04b XGBoost 的推导⭐ 「树是分段常数函数——落进同一个叶子的样本输出完全一样」,这是「GBT 不会外推」的前半句(后半句「所以预测被卡在训练范围内」在本章 ✅ 答案里)
ML基础 04 决策树与集成学习GBT 本身怎么长出来的原理版:分裂准则、随机森林、GBDT(⚠️ 那一章不讲取值范围和外推)
ML基础 16 特征工程基础时间字段、周期性、目标变换在这里有原理版
ML基础 13 RNN 与序列建模序列任务的四种形态;⭐ 以及一条对打榜直接有用的结论:时间序列预测上树模型常比 LSTM 强,LSTM 只配当对比基线(⚠️ 那一章不做趋势/季节/噪声的成分拆解,那部分看本章上面那张表)

✅ 检查点

  1. 拿到一个结构化赛题,前三步该做什么?
  2. 面对完全匿名的特征(feature_0...feature_129),有哪些反推手段?
  3. 时间字段除了「拆成年月日时」,还能挖出什么?
  4. weight 字段(样本权重)在竞赛里意味着什么?权重为 0 的样本该丢掉吗?
  5. 为什么树模型(GBT)对趋势性的捕获有天然局限?怎么补救?
  6. SMAPE 这类指标有什么坑?
👀 答案
  1. 看清评价指标(它决定了你优化什么、以及后处理该怎么做)②确认数据的时间/分组结构(这决定验证集怎么切,切错全白费)③看目标变量的分布(是否长尾、是否不均衡、有没有异常值)。⭐ 注意这三步都在建模之前
  2. 看分布形态(离散/连续、取值范围、是否有明显的分箱痕迹)②看和目标的相关性及单调性 ③看特征之间的相关矩阵——高度相关的一组往往是同源衍生 ④看随时间的变化(有些是静态属性,有些是滚动统计)⑤看缺失模式(缺失是否和某个时间段或某类样本绑定)。
  3. 周期性(小时/星期/月份,且要用 sin/cos 编码保持环形)②相对时间(距上次事件多久、距某个关键节点多久)——常比绝对时间有用得多 ③时间窗口聚合(近1/7/30天的统计)④数据本身的时间边界(训练集和测试集是否时间不重叠,这决定验证策略)。
  4. 通常意味着该样本在最终评分里的占比。⚠️权重为 0 的样本不计分,但不一定该丢掉——它们仍然携带特征分布和模式的信息,可以用于训练但不用于评估。正确做法是分别试「丢掉」和「保留但不计入验证分数」两种方案,用 CV 决定。
  5. 因为树模型只能输出训练时见过的取值范围内的分段常数——它无法外推。目标持续上升时,测试期的真实值超出了训练集的范围,树模型的预测会被卡在训练集的最大值附近。补救:先去趋势(差分、除以移动平均、拟合并减去线性趋势)再用树模型学残差,最后把趋势加回去
  6. 分母含预测值,模型可以通过「预测偏小」来刷分(不对称性)②真实值接近 0 时分母极小,单个样本的误差会被放大到失控③因此它对 0 值和小值极其敏感。应对:加平滑项、对小值样本单独处理、或直接用 SMAPE 的可微近似做损失,让训练目标和评估口径一致。

🛑 可以停在这里

走神救援
结构化赛最快拉开差距的是「你比别人更早看懂这份数据是什么」。前三步(都在建模之前):看清评价指标 → 确认时间/分组结构(决定验证怎么切,切错全白费) → 看目标变量分布反推匿名特征的手段:看分布形态(有无分箱痕迹)、看与目标的相关性和单调性、看特征间相关矩阵(高相关的一组往往同源衍生)、看随时间变化(静态属性 vs 滚动统计)、看缺失模式。时间字段除拆年月日,还要挖:周期性(sin/cos 编码保持环形)、相对时间(距上次事件多久,常比绝对时间有用得多)、多窗口聚合、训练测试的时间边界。⚠️weight=0 的样本不计分但不一定该丢——仍携带分布信息,可训练不评估,用 CV 决定。⭐树模型无法外推(只能输出训练范围内的分段常数),目标持续上升时预测会被卡住 →先去趋势、学残差、再把趋势加回去。⚠️SMAPE 的坑:分母含预测值所以「预测偏小」能刷分,且真实值接近 0 时误差被放大到失控

打卡记录保存在你的浏览器里,首页能看到总进度