返回列表

11th Place Solution | Unexpected Top 1%

561. Playground Series - Season 3, Episode 17 | playground-series-s3e17

开始: 2023-06-13 结束: 2023-06-26 预测性维护 数据算法赛
第11名解决方案 | 意外的Top 1%

第11名解决方案 | 意外的Top 1%

作者:Iqbal Syah Akbar

竞赛排名:第11名

发布日期:2023年6月27日

得票数:43票

我本以为前排位置只会有些许变动,但在公开了我的所有方法后还能冲进前1%?这可就大不相同了。无论如何,这里是我获得第11名所使用的方案:

交叉验证流程

我使用了iterative-stratification库中的MultilabelStratifiedKFold,因为我希望确保所有类型的故障百分比在整个折叠过程中保持一致。我之前也解释过这一点这里。我使用的分割数量是10折,因为5折与公开排行榜的相关性不够强。

我总是尝试在交叉验证管道内完成所有操作,比如添加原始数据、编码、缩放等。这样我就不必过多担心数据泄露问题。

特征工程

我在所有模型中都使用了category-encoders的CatBoost Encoder,除了CatBoost本身,因为出于某些原因CatBoost表现异常出色。实际上我已经在这里发布过相关内容这里,主要区别在于我将它放入模型管道中,而不是在交叉验证之前使用,从而防止了重大数据泄露。示例代码如下:

Encoder = CatBoostEncoder(cols = ['Product ID', 'Type'])
model = make_pipeline(Encoder, model)

至于创建新特征,我只创建了一个:IsFailure。这个特征描述了是否正在发生任何类型的故障(TWF、HDF等)。我只在Gaussian Naive Bayes模型中使用这个特征,其余的只是编码处理。

调参与集成学习

我使用了6个模型:Gaussian Naive Bayes、Random Forest、XGBoost、LightGBM、LightGBM的Dart和CatBoost。对于梯度提升模型,我使用Optuna进行调参。对于Naive Bayes和Random Forest,我完全没有调参,只进行了校准(我之前也发布过相关内容这里),并对Naive Bayes进行了进一步预处理(如尺度归一化和Yeo-Johnson变换)。

在完成所有模型的构建后,我使用LogisticRegression来寻找投票集成的最优权重。交叉验证得分为0.98006。最后,我重新在整个数据集上训练我的集成模型,以获得更好的最终结果,而不是仅仅依赖交叉验证过程。

编辑:我刚刚意识到我的最佳提交甚至没有使用Random Forest和LightGBM的DART

编辑2:完整代码可在此处找到:
https://www.kaggle.com/code/iqbalsyahakbar/11th-place-solution-code

同比赛其他方案