530. Playground Series Season 3, Episode 3 | playground-series-s3e3
感谢所有参赛者带来的又一轮富有成效的讨论!同样感谢 Kaggle 组织者提供的又一季有趣的 Playground 系列赛。我利用我在第2集中使用的 XGBoost + 聚焦 CV(交叉验证)的方法,成功获得了第8名的成绩(notebook 和 讨论)。
我在这次比赛中使用的 notebook 可以在这里找到。
本周比赛主要受 @craigmthomas 的精彩 EDA notebook 启发。我非常仔细地研究了这个 notebook,并根据这项 EDA 工作做出了很多决定。请给那个 notebook 点赞!
就像在第2集中所做的那样,我尝试了多种技术(XGBoost、CatBoost、神经网络、逻辑回归),XGBoost 始终给我最好的 CV 分数。其他模型很接近,但从未超越 XGBoost。
我使用了与之前相同的 CV 策略,即进行 10 折交叉验证,并且仅在每一折中使用合成数据集计算 AUC。我在每一折的训练集中加入了原始数据集(这次使用了完整的数据集),但没有以任何方式衡量在原始数据集上的表现。我认为这在本次比赛中是一个巨大的因素,特别是考虑到目标类别非常不平衡以及数据集规模较小。否则会有太多过拟合的机会。
这次比赛的一个很大不同在于我处理特征工程的方式。数据包含多种不同类型的数据,我独立处理每种类型。
其他人发现有些数据点的值过于极端。我选择将这些极端值重置为该特定特征的最大值。这里没有什么独特的——很多其他人的 notebook 也是这么做的。只有 2 个缩尾处理,但这确实消除了它们的异常值状态。
变量 BusinessTravel 是一个具有文本类别的有序变量:Non-Travel、Travel_Rarely、Travel_Frequently。这 3 个类别具有逻辑顺序,可以转换为数值 [0, 1, 2]。我预计高水平的 BusinessTravel 会导致人员流失,并希望保持变量的有序性质,而不是将其转换为多个独热编码文件。
有许多有序变量是用数字编码的。我保留了它们的原始形式,因为我认为相对水平可能很重要,而独热编码会大大增加特征的总数。
有 6 个分类特征我使用了独热编码。我担心这会创建过多的列,即使使用稀疏独热编码,我也查看了各种特征(在一个快速粗糙的 notebook 中)。对于这张图,我选取了所有平均 CV 大于或等于 0.8 的模型并计算了变量重要性——数百个模型。箱线图显示了每个变量的重要性(y轴)。
特别是 JobRole,看起来销售相关职位的流失率很高,而其他职位的流失率较低——参见箱线图的最右侧。我尝试将其更改为销售和非销售类别,但似乎没有帮助。对于第8名的最终提交,我保留了所有独热编码列。我也用这个方法删除了几列,但结果并没有改善。
对于连续变量,我也对它们进行了居中和缩放,这更多是出于习惯。我确信这对 XGBoost 来说并不重要。
使用 TPOT(一种 autoML 工具)得出了一个非常有趣的结果。我多次运行 TPOT,进行小规模、短时间的模拟,只是为了了解它找到了什么样的模型。大约 90% 的时间 XGBoost 或 GradientBoostingClassifer 是顶级分类器。