646. Playground Series - Season 5, Episode 3 | playground-series-s5e3
哇,真是大变局!我从第一天就担心会有大变局,所以我保持解决方案简单。
一般来说,对于表格数据,我喜欢融合 GBDT 和神经网络 (NN)。然后我尝试添加一些机器学习模型,如 SVR, LR, KNN 等。此外,在 Kaggle Playground 比赛中,我们必须决定如何使用创建合成数据所用的原始数据集。
当训练数据较小(行数少)时,我很少或不做特征工程,因为容易过拟合训练数据。当数据较大(行数多,如 12 月和 2 月的 Playground 比赛)时,我会做大量特征工程。
在这次比赛中,我选择不做特征工程。我的解决方案只是多个模型的简单平均,每个模型都在“原样”数据上训练, without 特征工程。所以在这次比赛中,我把时间花在训练不同的多样化模型上(以不同方式使用原始数据)。并使用分组 K 折交叉验证 (Group K Fold) 评估本地集成袋外 (OOF) CV 分数。(并且每个集成使用等权平均以避免集成过拟合)。
在这次比赛中,我使用了 6 折的 Group K Fold。我将训练数据分为 6 年,每年作为一个折。因为测试数据是两年的新数据。
train['group'] = train['id']//365
train.csv 数据是 6 年共 2190 行。原始数据集是 1 年共 366 行。一种添加原始数据的方式是使用 pd.concat() 添加新行。(此时它变为 group=7 用于训练,并在验证分数计算中被忽略)。
train = pd.concat([train,orig],axis=0)
单模型使用 max_depth=3, colsample_bytree=0.9, subsample=0.9,类似于我的 XGB starter notebook 版本 1 [1]。我们使用“原样”数据 without 特征工程。(使用将原始数据作为新行的训练数据)。
单模型使用“原样”数据 without 特征工程。(使用将原始数据作为新行的训练数据)。
上述两个模型的等权集成获得了第 11 名!
train.csv 数据有 11 个特征列。原始数据也有 11 个特征列。一种添加原始数据的方式是使用 pd.merge() 添加新列。(我们在上一次 Playground 比赛中分享了这个想法 [3])。
m = train.rainfall.mean()
for c in COLS:
n = f"{c}2"
train[n] = train[c].map( orig.groupby(c).rainfall.mean() )
train[n] = train[n].fillna(m)
单模型使用 RAPIDS SVC,参数 C=0.1, kernel='poly', degree=1,类似于我的 starter notebook [2]。我们使用“原样”数据 without 特征工程。(使用将原始数据作为新列的训练数据)。这个单模型获得了第 2 名!
上述三个模型的等权集成获得了第 1 名!
对于我的最后 2 次提交,我训练了一些其他模型(CatBoost, LogisticRegression, XGBoost, SVR)并提交了两个不同的 6 模型等权融合。上述三个模型是最强的。额外的模型将集成 CV 分数提高到了 0.900 和 0.901,但没有将私有 LB 分数提高到超过 0.906。我的最后 2 次提交的 6 模型集成如下: