566. Playground Series - Season 3, Episode 19 | playground-series-s3e19
大家好,我想向大家展示我在本次竞赛中的简单解决方案。该方案在公开排行榜上约获得第70名,而通过融合最佳公开提交方案,我们成功达到了第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名(前6%)。这里同样没有高深的技术,方法非常简单。预处理包含以下步骤:
Day(日)、Month(月)、Year(年),以及周末标志IsWeekend和周日标志IsSunday。MonthSin和DaySin。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 - 销售预测
祝好!