感谢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系列的下一期。