370. Categorical Feature Encoding Challenge II | cat-in-the-dat-ii
感谢 Categorical Feature Encoding Challenge II 比赛的组织者,以及 Kagglers 之间的慷慨分享和讨论,这对我帮助很大。我将尝试描述我的整个比赛过程:
当我第一次参加这场比赛时,我看到许多参与者说简单的 LogisticRegression(逻辑回归)效果很好,所以我使用了 sklearn.linear_model.LogisticRegression 模型,使用 hyperopt 进行超参数搜索,然后以 40 折交叉验证训练模型作为基线。后来尝试了 catboost,但效果并不好。我发现数据集中离散分类特征占了很大比例,因为我在其他比赛中使用过 Wide & Deep 和 DeepFM,所以我认为使用一些用于 CTR(点击率预测)的深度学习可能会有更好的结果,事实证明这是一个正确的选择。
部分训练过程我使用了 deepctr 包,来源:
- https://github.com/shenweichen/DeepCTR
你可以使用 pip install deepctr 安装它。
特征工程(FE): 我没有过多关注特征工程,所以我只做了一些常规的 FE。
data_df['num_null'] = data_df.isna().sum(axis=1)
data_df['ord_5_0'] = data_df['ord_5'].str[0]
data_df['ord_5_1'] = data_df['ord_5'].str[1]
在这个阶段,我用 TensorFlow 重写了 LogisticRegression(batch_size = 8192, optimizer = 'Adam', regularizers = l2)作为新的基线。
之后,我尝试了多种 CTR 模型。如果没有特殊说明,我使用 hyperopt 在训练集上进行 5 折交叉验证进行超参数搜索,并选择表现最好的 5 个超参数。最后对每个超参数组合在训练集上进行 40 折交叉验证并取平均值,作为最终得分。
我在 CIN 和 CrossNet 中不使用 Deep 和 Linear 组件的原因是因为我想分别查看这两个模块的性能,并且我想在未来 Stacking 表现良好的模型,而 Stacking 更倾向于优秀且不同的模型。
可以看出 CIN 在训练集上表现最好。在我将这些结果提交到排行榜(LB)后,验证了我的判断。但有趣的是,当我 Stacking 所有模型时,虽然训练集上的分数提高了,但 LB 上的分数却明显下降了。考虑到可能存在的过拟合风险,我放弃了 Stacking 的想法。
我开始专注于训练 xDeepFM。通过与前阶段相同的方法,我得到了更好的分数:0.78955,但问题随之而来。我们可以看到 xDeepFM 在训练集上表现最好,但是当我把结果放到 LB 上时,分数不升反降。
那么我应该相信什么?训练集上的交叉验证分数还是公共排行榜(PLB)?
我仔细分析了比赛数据集。训练集有 60 万行数据,测试集有 40 万行数据。PLB 只使用了 25% 的测试数据,即 10 万行。当我使用 5 折交叉验证时,每一折的验证数据集是 12 万行,这与 PLB 使用的数据量更接近,并且同一模型不同折之间的验证分数经常在 [0.790 和 0.787] 之间跳动,方差相对较大。最重要的是,当使用相同的 k