非常感谢Kaggle和Godaddy举办这次比赛。祝贺所有获奖者,也感谢创建了许多优秀公开笔记本的朋友们。
以下是我的解决方案:
验证方法
- 使用最近12个月的数据作为验证集
- 为评估解决方案的有效性,我额外计算了12个验证月中"改善月份"的数量(而非简单的平均CV提升)。因为某些月份的增长率(
mbd(当前月+1)/mbd(当前月)-1)存在异常高/低的情况,平均CV可能导致过拟合
异常值平滑处理
- 对2022年6月至2022年8月的数据进行均值平滑,处理普遍的急升-急降现象

- 还存在其他类似"原始值→急升→急降→原始值"的数据点,但尚未找到最佳处理方法
- 采用giba提出的基于分数的基本常数平滑
- 对几乎不变的cfips设置稳定黑名单:
- [28055, 13101, 13265, 31009, 31115, 31149, 38047, 38087, 48033, 48301]
特征工程
- 行动差异、目标平移、目标差异
- 目标差异窗口:
- 求和
- 标准差
- 目标窗口:
- 求和
- 0.2分位数
- 0.8分位数
- 下界:
- 仅当sign(0.2分位数)=sign(0.8分位数)时有值,其他情况为0
- 负值时取0.8分位数
- 正值时取0.2分位数
- 州集群
增强建模框架
构建增强模型框架,输入:1) 特征 2) n_cross:需预测的未来月份数,输出:未来n_cross个月mbd的增长率。通过调整n_cross从1-5,可直接预测公开/私有mbd。
详细结构:
- 增强框架特征 = 基础特征 + n_cross
- n_cross = 预测未来mbd的月份数
- 输出目标:
[mbd(当前月+n_cross)/mbd(当前月)]**(1/n_cross)-1 - 模型:Xgboost
目标扁平化:使用扁平化目标训练并在预测时进行逆变换
- 目标变量的分布随活跃基数变化而变化。活跃基数越低,目标的绝对值越高。

- 通过模拟将所有活跃基数转换为相同的目标分布。假设转换后分布将变扁平,据此构建转换公式:
coef=(1/(0.007*(active_series/10+105))+1)target_flatten=target_series/coef
- 使用扁平化目标训练模型,预测时进行逆变换
后处理
- 我注意到公开排行榜月份的趋势异常高于正常月份。这种现象也出现在其他月份(如2022年7月)。我认为这种整体月份趋势不可预测,模型不应过拟合它。
- 考虑到公开月份的mbd是后续私有月份的基础,我对预测结果进行如下后处理:
prediction=prediction*(1+0.001)