第40名方案 0.553 - 0.555, 提升1050个名次
第40名方案 0.553 - 0.555, 提升1050个名次
作者: DN (Expert) | 比赛排名: 第40名
我想许多正在阅读这篇文章的人都能理解,在整个比赛过程中一直处于1000名开外,同时还要坚持做正确的事情,是多么困难。😏
我当然没有做以下事情:
- 任何测试集特征的调整(几乎所有公开的Kernel都使用了按均值比率调整的方法)。
- 为了拟合训练集的类别分布而调整最终预测的舍入阈值(即当我们把连续值转换为离散标签时)。这在几乎所有公开的Kernel中都被使用了。
这使我没有过拟合于显然有偏差的公开测试集分布(只有14%的数据,这从我的实验和讨论中可以清楚地看出)。
但同时也让我一直停留在1000名开外的LB位置...
我解决的是回归问题。这是正确的方法,因为kappa指标对不同的错误惩罚不同。除了公开Kernel中可用的一些流行特征外,我还使用了基于“失误”和“回合”的特征,发现它们很有帮助。还使用了基于计数器的额外自定义特征。经过特征选择后,只保留了505个特征。
训练:
- 使用带有标签的测试样本进行训练。
- 使用了自定义的 RandGroupKfold,因为 sklearn 的 GroupKfold 没有 "seed" 参数来提供随机性。
- 由15个LGBM模型组成的集成(3次CV迭代,每次5折,不同折之间的 "feature fraction" 参数有所变化)。
- 通过选择具有唯一ID的随机样本进行了对抗验证(200次迭代)。计算并保存了每个模型的中位数分数(在模型投票阶段用作权重)。
- 基于整个训练集,针对每个模型单独通过 OptimizedRounder 实现了舍入阈值优化。因此,15个模型中的每一个都有自己的一套舍入阈值,用于最终预测。
- 预测置信度是基于到最近舍入值的距离与相邻舍入值之间的间隔长度的比率计算的。这些置信度在模型投票阶段被用作权重。
- 模型投票阶段的权重基于中位数折分数和置信度值。
我使用 SortedList, SortedDict, SortedSet(来自 sortedcontainers 包)为带有 "set" 和 "dict" 的特征以及所有模型的 "seed" 值提供了完整的结果可重复性。这在模型选择和提交阶段帮了我大忙。
没有起到作用的事情:
- 训练数据集增强。
- 在 LGBM、CATBoost 和 XGBoost 中使用 kappa 指标作为停止标准的评估方法(它非常不稳定)。
- 将 LGBM 与 CATBoost、XGBoost 和 NN 模型集成(结果与 LGBM 单模型几乎相同,但训练时间增加了很多)。
感谢阅读,祝未来的比赛好运!