返回列表

Blending best public submissions - 17th | Simple approach - ~70th

566. Playground Series - Season 3, Episode 19 | playground-series-s3e19

开始: 2023-07-11 结束: 2023-07-31 销量与需求预测 数据算法赛
融合最佳公开提交方案 - 第17名 | 简单方法 - 约第70名

融合最佳公开提交方案 - 第17名 | 简单方法 - 约第70名

作者:mateuszk(Kaggle Master)
发布日期:2023-08-01
竞赛排名:第17名(前2%)

大家好,我想向大家展示我在本次竞赛中的简单解决方案。该方案在公开排行榜上约获得第70名,而通过融合最佳公开提交方案,我们成功达到了第17名的成绩。

第17名解决方案:

第17名的解决方案非常简单。我注意到@yeoyunsianggeremie发布了一个包含最佳公开提交方案的数据集,地址为:https://www.kaggle.com/datasets/yeoyunsianggeremie/s3e19-top-public-notebook-submissions。由于@paddykb提到了可能存在的数据构造错误,我推断在本次竞赛中探测LB(排行榜)可能有效。因此,我只是好奇通过均值策略融合这些最佳公开预测能达到什么效果。结果证明,这种方法成功让我们在私人排行榜上获得了第17名的成绩(前2%)。整个过程没有任何复杂分析,只需融合这些最佳公开提交方案,假设存在数据构造错误,效果就会很好。完整代码如下:

import glob
from functools import partial

import pandas as pd
import numpy as np

path = "/kaggle/input/s3e19-top-public-notebook-submissions"

best_public_lb_paths = glob.glob(f"{path}/*.csv")
best_lbs = pd.concat(map(partial(pd.read_csv, index_col="id"), best_public_lb_paths), axis=1)
best_lbs.columns = [name.split("/")[-1] for name in best_public_lb_paths]
best_of_best_lbs = best_lbs.drop(  # 部分提交未进行后处理
    [
        "bogoconic1_48.86.csv",
        "nivedithavudayagiri_38.87.csv",
        "oscar_no_postprocessing.csv",
        "paddykb_no_postprocessing.csv",
    ],
    axis=1,
)

submission = pd.DataFrame(
    {
        "id": best_of_best_lbs.index,
        "num_sold": best_of_best_lbs.mean(axis=1).astype(np.int32),
    }
).set_index("id")

submission.to_csv("submission.csv")

约第70名解决方案:

现在来介绍我的原始方案,该方案在私人排行榜上约获得第70名(前6%)。这里同样没有高深的技术,方法非常简单。预处理包含以下步骤:

  • 修正新冠期间数据 - 新冠封锁期间数据存在小幅下降,需要进行修正。我采用简单策略:从2020年3月初到7月底,将每个观测值乘以特定系数。具体做法是取2017-2019年同一时期各观测值的平均销量,除以新冠封锁期间观测到的实际值,从而得到调整系数。
  • 数值化日期 - 添加数值型日期特征,包括Day(日)、Month(月)、Year(年),以及周末标志IsWeekend和周日标志IsSunday
  • 三角函数特征 - 添加正弦函数特征,如MonthSinDaySin
  • 节假日特征 - 使用holiday库为每个国家添加节假日标志IsHoliday
  • 原始特征编码 - 使用OrdinalEncoder对原始特征进行编码。

模型方面,直接使用普通的LGBMRegressor,并通过Optuna进行了少量正则化参数优化。同时,我将对数变换后的目标值进行拟合。参数设置如下:

params = {
    "random_state": 51,
    "learning_rate": 0.17,
    "min_child_samples": 336,
    "colsample_bytree": 0.5,
    "reg_lambda": 8.35,
    "reg_alpha": 0.36,
}

由于该模型在公开排行榜上的得分非常不理想,我开始进行探测分析,最终得到以下国家系数映射:

probed_map = {
    "Argentina": 4.5,
    "Spain": 1.6,
    "Japan": 1.2,
    "Estonia": 1.7,
    "Canada": 0.9,
}

该方案在公开排行榜上得到6.08955分,在私人排行榜上得到7.21200分。由于我在竞赛结束前几天才加入,无法进一步提升成绩,但考虑到方法的简单性,我认为这个结果已经相当不错。实际上,要获得这样的结果,可能根本不需要训练模型,只需找到合适的系数即可。

特别感谢:

我的完整代码笔记本:Playground Series S3E19 - 销售预测

祝好!

同比赛其他方案