返回列表

#4 solution: Feature engineering made the difference

542. Playground Series - Season 3, Episode 11 | playground-series-s3e11

开始: 2023-03-20 结束: 2023-04-03 定价与促销 数据算法赛

#4 解决方案:特征工程起到了决定性作用

作者:Benedikt Droste (Grandmaster)

发布日期:2023-04-04

比赛排名:第4名

得票数:20票

感谢Kaggle举办这个Playground系列。这些合成数据集允许快速进行多种不同的实验。

我的解决方案基本上是5个模型的融合:LightGBM (2个)、XGBoost (2个) 和 Catboost (1个)。

数据

  • 我将原始数据添加到我的交叉验证流程中。在每一折的训练过程中,我使用了原始数据,但仅使用合成竞赛数据进行验证:
  • 因此,我将原始数据标记为fold -1,使其不会在任何迭代中作为验证数据集使用
  • 我使用np.log(cost)转换目标变量,并以rmse作为优化目标
  • 我使用了原始变量的一个子集:'store_sqft', 'florist', 'salad_bar', 'prepared_food', 'coffee_bar', 'video_store', 'total_children', 'avg_cars_at home(approx).1', 'num_children_at_home'

特征工程

  • 我花了很多时间在特征工程上。最重要的特征是商店特定属性的综合评分:
  • store_features= ['coffee_bar', 'video_store', 'salad_bar', 'prepared_food', 'florist']
  • df['store_score'] = df[stores_features].sum(axis=1)
  • 我还计算了与商店面积相关的比率:
  • df['store_score_ratio'] = df['store_sqft'] / df['store_score']
  • 仅使用这两个特征,我就能训练一个单独的LightGBM模型,其公开分数为0.2926,私有分数为0.29326(私有排行榜排名范围从9到37)。交叉验证分数也更好:
  • 将新特征作为分类变量传递给LGBM非常重要
  • 对于XGBoost和Catboost,我未能获得如此显著的改进。我为它们构建了另一个特征,没有包含比率:
  • (df['florist']*3) + (df['food_proxy']*2) + df['coffee_bar'] + df['video_store']
  • df['food_proxy']是熟食和沙拉吧的总和,然后二值化为1,我将该特征作为数值特征传递
  • 与公开方案相比,特征工程给我的提升最大

模型融合

  • 使用Optuna优化的简单加权融合

未成功的方法

  • 使用多个模型和不同特征子集的融合
  • 各种堆叠方法对我而言都更差
  • 我尝试根据原始数据清理商店特征的不一致值,但结果反而更差
  • 除LGBM、XGB和Catboost之外的其他模型明显更差,在融合时也没有增加价值

感谢大家参与这场有趣的竞赛。我期待Playground系列的下一期。

同比赛其他方案