返回列表

1# Winning solution

550. Playground Series - Season 3, Episode 14 | playground-series-s3e14

开始: 2023-05-02 结束: 2023-05-15 产量与品质预测 数据算法赛
#1 获胜解决方案 - 游乐场系列 S3E14
作者:Sergey Saharovskiy (Kaggle Grandmaster)
竞赛排名:第1名
发布时间:2023-05-17

大家好,

我想向组织者、获胜者以及使这次竞赛成为可能的社区致以最深的感谢。

引言:

本次竞赛吸引了创纪录数量的参与者。
社区非常活跃。讨论富有成效,创造了一个促进学习和分数快速提升的协作环境。金牌/银牌笔记本和讨论的数量本身就说明了这一点。

这对我来说不是一段轻松的旅程。我花了近5个月的时间来完善表格竞赛的解决方案流程。有几次我曾位列公共排行榜第一,但未能经受住排名波动。还有几次我选择了错误的提交。这些经历让我吸取了教训,也让我明白:"如果方法扎实,你就不需要一天提交5次。"

解决方案:

背景:

从竞赛一开始,我就发现模型的性能会受到一个非常重要的特征的限制。我在这里发布了讨论,展示了从原始数据集合成产生了多少方差。无论集成模型多么优秀,都无法提供我获得的获胜优势。

早期发现:

在模型验证的早期阶段,我发现模型在某些明显的预测上表现不佳。
最常见的错误是yield == 1945.53061。您可以在附件作品中看到这一点。
我注意到,对于train和origin都相同的fruitsetfruitmass0.335339 0.233554,无论什么模型,其预测值始终是1945.53061。所以我将这些预测值指定为1945.53061,并观察OOF(袋外验证)的表现。正如您所想,效果非常好。

后来我又发现了几个类似的例子,您会在笔记本的第一阶段校正中看到它们。

自动化过程:

我意识到手动搜索不可扩展,因此编写了一个完整的脚本,用于遍历train和test中常见的fruitsetfruitmass值。测试集共有2073个样本。
但应该分配什么值呢?很简单,我迭代遍历了所有唯一的776个yield值,观察哪个效果更好。虽然这改善了OOF表现,但在排行榜上表现不佳,所以我最终采用了原始数据集中的值,这效果就像一颗核弹(我将在后续继续用这个类比)。

策略:

我决定采取缓慢推进的策略。第二阶段的后处理包括按风险程度排列的不同提交版本瀑布流。
我根据国际核事件分级表对它们进行命名,其中anomaly(异常)仅指1945.53061的修正。
然后您可以使用这些代码行进行更深入的修正:

if len(dsp_train) > 2 and len(dsp_test) > 1:
	if not dsp_origin.empty:
		orig_value = dsp_origin['yield'].values[0]
		tr_idx = train.loc[train.fruitset.eq(txt[0]) & train.fruitmass.eq(txt[1]), 'pred'].index.tolist()
		te_idx = test.loc[test.fruitset.eq(txt[0]) & test.fruitmass.eq(txt[1]), 'pred'].index.tolist()

len(dsp_train) > 2 and len(dsp_test) > 1:意味着在train中至少要有两个以上的共同记录,在test中至少有一个,在origin中也至少有一个。

Serious Incident(严重事件) : > 4 > 3
Zone With consequences(后果区): > 3 > 2
Dangerous Zone(危险区): > 2 > 1
Ground Zero(零点区): > 1 > 0 (未提交)

在私人排行榜上失败的风险很大,这就是为什么您稍后在提交截图中会看到_private_600后缀的原因。

@adaubas 帮助完善了策略:

一次提交就获得第二名,多么精彩的发挥!正是@adaubas慷慨地分享了配置和作品

这如何帮助了我呢?其实很自然,一旦配置在趋势中传播开来,我就可以在讨论后立即跃升至第二名。所以我甚至发布了一个带有我接近结果的配置预告(狡猾的我……)。

堆叠大师课:

第一层模型包括8个不同的OOF。它们可以在这个数据集中找到。

以下是模型流水线以及帮助获胜解决方案的作品:

高分辨率版本ctrl + 滚轮向上放大查看。

LAD vs scipy.minimize

很高兴从@adaubas那里了解到LAD。
我发现我使用了相同的后端,结果也非常相似。
但为了代码简洁性和略微更好的性能,我最终选择了LAD。
以下是对比:

验证:

结尾:

@naganohikaru致敬

上述后处理的效果非常巨大。各种模型融合仅带来浮点数级别的改进,而后处理有时却能带来整数级别的提升。
您看到我在排行榜上不断跳跃。我等待着@naganohikaru的下一步动作,然后理解着风险投下了"炸弹"。

我最终停留在危险区,因为我没有看到对手再有改进,这减轻了私人排行榜上已经很高的风险。

承担提交风险

我选择了两个公共得分最高的提交(它们恰好也是我私人排行榜上最好的)。动机很简单,我意识到Alex模型在最终堆叠中的占比不大,我唯一能获胜的方式就是承担全部风险。否则,我将与数百种相同类型的集成方案竞争。

致谢

p1 @zhukovoleksiy 笔记本链接
p2, p5 @paddykb 笔记本链接
p3, p6 @yzokulu 笔记本链接
p4 @tetsutani 笔记本链接
p7/p8/p9 @adaubas 笔记本链接
@mattop 后处理

锦上添花

如果上面的对手在最后找到了什么奇迹,我的最后一步会是什么?

您说得对 - 零点区提交,就是这个:

同比赛其他方案