返回列表

3rd Place Solution in Three Words!

640. Playground Series - Season 5, Episode 2 | playground-series-s5e2

开始: 2025-02-01 结束: 2025-02-28 定价与促销 数据算法赛
三个词的第三名解决方案!
作者: automatylicza (Sebastian Kruszek)
竞赛排名: 第 3 名
发布时间: 2025-03-01

三个词的第三名解决方案!

决心 – 创造力 – 运气

我把运气的定义留给你们决定。

大家好!

我叫 Sebastian,首先,我要感谢 Paweł Godula 先生 – narsil (jobs-in-data.com) 在波兰传播 Kaggle 理念,最重要的是,他在多年后帮助我发现了我将在生活中追求什么,以及我将在哪个领域成为世界上最好的人之一。

Chris Deotte – 感谢你所做的一切以及你做事的方式。WooHoo!!!


解决方案的主要阶段

我的解决方案中必不可少的一部分是其他竞争对手分享的代码。主要角色包括:@cdeotte, @masayakawamata, @mikhailnaumov@vyacheslavbolotin

  1. 特征工程
    1. 距离特征 (feh_distance)
      • 对于原始数据集 train_rawtest_raw,基于选定属性之间的距离(映射为数值后)计算新变量。
      • 创建诸如 _2_1, _2_2, … _5_1 等列,它们代表选定(映射)属性的平方差之和的平方根,例如 (x1 - x3)² + (x2 - x4)² 等。
      • 这产生了十几个特征,表达了背包内部的“相似性/差异性”。
    2. 创建组合(COMBO)特征
      • 对于每个原始分类列(例如 Brand, Style, Color 等),通过与 Weight Capacity (kg) 结合创建一个新特征。
      • 示例:new_col = Brand * 100 + Weight Capacity (kg)
      • 这有助于捕捉类别与背包承重能力之间的相互作用。
    3. 来自外部数据集的统计信息 (orig_price_*)
      • 基于外部数据集 (Noisy_Student_Bag_Price_Prediction_Dataset.csv),计算以下值:orig_price_mean, orig_price_std, orig_price_min, orig_price_max, 和 orig_price_median
      • 变量 orig_price_missing 用于捕捉给定组合未出现在外部数据集中的情况。
    4. 分组聚合与目标编码
      • 采用 GPU 加速 分组(使用 cudf)以更快地计算统计信息,如均值、标准差、最小值、最大值、中位数、计数和偏度。
      • 执行了多次聚合,包括按 Weight Capacity (kg) 和 COMBO 特征分组。
      • 此外,对 BASE_FEATURES 中的列应用了 目标编码(通过 cuml.preprocessing.TargetEncoder 实现)。结果,每个特征都被其类别内的(平滑)平均 Price 替换。
    5. 缺失值指示器 (_NaN_*)
      • 为 7 个主要分类特征中的每一个定义了缺失指示器(例如,如果 Brand 等于'Missing',则 _NaN_Brand = 1)。
      • 此外,列 _7_NaNs 总结了所有关键字段中缺失值的数量。
  2. 带有监督层的自编码器特征提取
    • 构建并训练了一个 自编码器(使用 Keras + TensorFlow),具有两个主要输出分支:
      1. 重建原始数值特征(重建 = Weight Capacity (kg)),
      2. 在监督分支中预测目标值(Price)。
    • 因此,隐藏层(latent)包含数值特征的表示,同时也“知道”如何协助预测价格。
    • latent 向量成为一个有价值的特征,附加到模型的最终输入中。
  3. 模型与集成
    • 使用了四个 基于树 的模型:LightGBM, XGBoost, XGBoost(配置不同), 和 CatBoost。
    • 最后应用了 堆叠(Stacking):来自 (LGBM, XGB, XGB2, CatBoost) 的预测向量被用作 BayesianRidge 模型的输入,该模型完成集成预测。
    • 调整基于树的模型和 BayesianRidge 的系数以最小化 RMSE。

训练与预测

  • 10 折 KFold 用于结果稳定,
  • 每次迭代生成来自 4 个模型(LGBM, XGB, XGB3, CatBoost)的袋外(OOF)预测,
  • 堆叠(使用 BayesianRidge),
  • 最终测试预测是应用于堆叠预测的贝叶斯模型的输出。
  • 获得最佳结果的提交物与几个公共提交物进行了仔细混合。

总结:

该笔记本大量使用了特征工程——既有经典的(分组聚合、目标编码、处理缺失值),也有更高级的(自编码器、距离特征、外部价格数据)。最终的集成结合了几个基于树的模型,并在最后一层利用 BayesianRidge,这进一步稳定了结果并降低了 RMSE。


一些随笔 – 来自新手给新手

我一生中做过很多事情,但没有一件与 IT 有关。大约三个月前,我开始学习 Python 和 SQL,直到两个月前才发现 Kaggle,所以我写的关于比赛经历的所有内容都可能包含错误,我可能会出错。

我玩过很多游戏,通常决定因素是游戏是否具有足够的挑战性。Kaggle 是我知道的最具挑战性的游戏,它带来的满足感完全处于另一个水平。

一些随笔 – 来自新手给新手,这些想法在 背包预测挑战赛 结束时掠过我的脑海。也许明天我会有不同的结论,所以请不要太重视它们。比赛结束时的反思主要是非技术性的,因为我几个月后才会准备好解决那些问题。

  • 永远不要花太多时间在关键方面的基本理解上,即使那些看似最简单的方面。 如果我认为我理解了某件事,我经常发现还有更多内容。即使我们没有发现任何全新的东西,深入研究评估指标或探索性数据分析(EDA)等主题也能激发出似乎来自完全不同领域的想法。
  • 从一开始就追逐排行榜分数 可能不是最佳策略。
  • 优化 – 它允许快速测试想法,有时在 competition 结束时证明至关重要,当模型开始增长和合并时。
  • 获胜的欲望 是一种极好的学习方法,或者至少我希望如此。
  • 理论与实践 – 在我看来,训练几十甚至几百个不同的模型比读几本书能提供更多的见解。我以前反复阅读但无法掌握的概念现在似乎显而易见。
  • 创造力和非传统想法 会得到回报,但它们应该在正确的时刻应用——例如,在 competition 中期,当我无法使用标准方法增强 XGB 发现的信号时。在测试了十几个非常奇怪的解决方案后,我发现了一个显著提高分数的函数。这个函数放大了与中值预测的偏差——偏差越大,值越高。然而,随着我完善模型,我注意到随着预测质量的提高,这个想法不再起作用。
  • 实验 – 我相信我会再次发现一些其他人没有想到的有趣东西,但现在我知道最好在后期而不是在 competition 中期进行搜索和实验。
  • 硬件 – 我在 Kaggle 提供的免费资源上进行了绝大多数计算(我自己的硬件要弱得多)。虽然我在 competition 的最后几天大部分时间都在最终不成功的尝试优化我的自动特征选择器上,但我认为这不是障碍。我敢打赌,即使是在 CPU 上,加上一个好主意,也有可能获胜。
  • 整体规划 – 如果我要重新开始这个 competition,我会做得完全不同,主要专注于完善一个模型和发现新的强特征的方法,也许在最后 Incorporate 更多模型以获得更好的结果。
  • Kaggle 材料的选择 – 仔细选择我们使用的材料至关重要。收集三四个来自公共笔记本的优秀想法,至少在 Playground 阶段,已经提供了很多。
  • Chris Deotte – 如果你遇到他的帖子,就多待一会儿。

你怎么看?你有什么经验?


祝大家在未来的比赛中好运。

谢谢大家带来了一场精彩的比赛。

我们在 trail 上见,在排行榜(LB)的顶端见。


Sebastian Kruszek
automatylicza@gmail.com


每天更强!(Codziennie Silniejsi!)

同比赛其他方案