538. Playground Series - Season 3, Episode 8 | playground-series-s3e8
简介
又是新的一周,再次向比赛的获胜者致敬!
写这篇文章的过程很痛苦,但 @jcaliz 鼓励了我,因为这个解决方案并非显而易见。
前言
大学时期我对宝石学很感兴趣,甚至考虑过获得 GIA(美国宝石研究院)认证来鉴定宝石。我还曾计划开一家自己的当铺,用来分拣钻石而不是 pandas 数据框。令人惊讶的是,我们的兴趣和职业道路会随着时间而改变。虽然我目前的重心完全不在宝石学上,但过去的经历和兴趣仍然可以是宝贵的财富。
第1部分:对抗异常值
看看这3张插图,我试图根据合理的价格范围来截断异常值(红框显示了 train 和 original 数据集差异极大的区域)。



一旦我修正了异常值的数值,CV(交叉验证)分数得到了极大的提升,但在 LB(公开排行榜)上的结果却很差……
为了理解为什么会发生这种情况,我决定查看最佳预测,瞧!原来所有模型都已经压缩了异常值,所以没有理由去修正它。

第2部分:模型本身已经很好了
我查看了 @tetsutani 和 @eamonntweedy 写的公开作品,因为他们的建模部分与我的有些相似。我发现的一个共同点是,模型从一开始就很好且泛化能力很强。虽然我真的不喜欢那种被压缩的预测值,所以我试图自己“帮助”模型。我大胆地想象自己是一名注册鉴定师,开始手动标记数据。
第3部分:可视化与完美的宝石
并无意自我推销,但我开始越来越多地研究 When 4Cs Concept becomes an Art 这个话题。我从训练集中选择了特定克拉范围内的“Ideal”切工、“D”色(最佳无色)、“Flawless”(无瑕)的宝石。想法是找到指定宝石组的最大可能值,并将其与测试预测进行比较,如果测试预测因某种原因更高——将训练集中的 Q3 + (1.5 * IQR) 分配给测试预测。这为20个样本带来了 +0.01 的 LB 提升。当我决定稍微自动化一下时:
def postprocess_clip_sub(best_sub: pd.DataFrame, alpha: float) -> pd.DataFrame:
"""