561. Playground Series - Season 3, Episode 17 | playground-series-s3e17
我本以为前排位置只会有些许变动,但在公开了我的所有方法后还能冲进前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