返回列表

2nd place solution: OOF Ensemble

599. Playground Series - Season 4, Episode 3 | playground-series-s4e3

开始: 2024-03-01 结束: 2024-03-31 缺陷检测 数据算法赛
第二名解决方案:OOF集成方法

第二名解决方案:OOF集成方法

作者:Moonlit (Kaggle贡献者) | 发布日期:2024年4月1日 | 获得票数:56 | 竞赛排名:第2名

大家好,
我从未想过会在这里分享我的解决方案。作为一名学生,这是我第一次完整参加Kaggle竞赛。

竞赛背景

钢板缺陷预测竞赛 (Playground系列 - 第4赛季第3场)

我的解决方案代码

完整代码:https://www.kaggle.com/code/yunqicao/2nd-place-solution-steel-plate-defect-prediction

解决方案详解

1. 数据处理

我将竞赛提供的数据与原始数据集合并,并排除了具有多个缺陷标签的行(这些样本只占很小比例)。

2. 特征工程

我创建了新特征并移除了部分特征。特征选择主要基于以下三个方面:

  • 交叉验证分数
  • 特征重要性分析
  • 特征间相关性分析

def feature_engineering(data):
    # 创建长度与厚度比特征
    data['Ratio_Length_Thickness'] = data['Length_of_Conveyer'] / data['Steel_Plate_Thickness']
    
    # 创建标准化厚度特征
    data['Normalized_Steel_Thickness'] = (data['Steel_Plate_Thickness'] - data['Steel_Plate_Thickness'].min()) / 
                                        (data['Steel_Plate_Thickness'].max() - data['Steel_Plate_Thickness'].min())
    
    # 创建X范围与像素面积乘积特征
    data['X_Range*Pixels_Areas'] = (data['X_Maximum'] - data['X_Minimum']) * data['Pixels_Areas']
    
    return data

# 需要移除的特征列表
features_to_drop = ['Y_Minimum', 'Steel_Plate_Thickness', 'Sum_of_Luminosity', 
                    'Edges_X_Index', 'SigmoidOfAreas', 'Luminosity_Index', 'TypeOfSteel_A300']

感谢以下参考资料:

3. 交叉验证与参数调优

我选择了四种多分类模型:XGBoost、LightGBM、CatBoost和HistGradientBoosting,采用10折交叉验证,并使用Optuna进行超参数优化。最终预测结果取10折预测的平均值。

参考资料:钢板缺陷检测技术探索

4. 折叠集成(OOF Ensemble)

我利用折叠文件(OOF)创建了三个模型的集成:

为确保一致性,我复现或调整了这些公开笔记本以生成相同训练-验证分割的OOF文件。使用Nelder-Mead优化算法调整集成权重以优化交叉验证分数。

感谢:XGBoost解决方案

5. 简单集成

最后阶段,我将自己的提交与优秀的公开提交进行组合,包括:XGBoost集成方案。由于最后阶段提交机会有限,我基于直觉分配权重,最终发现使用平均权重效果良好。

6. 其他尝试

尝试但未成功的方法:

  1. 伪标签(Pseudo labeling)
  2. 使用XGBoost作为元模型的堆叠方法
  3. 将评估指标改为'roc_auc'

参考方案:基础XGBoost方案

7. 关键发现

值得注意的是,仅使用平均权重简单集成上述公开笔记本的输出,就能获得优异成绩:

  • 公共排行榜分数:0.89684
  • 私人排行榜分数:0.88923
这证明这些公开笔记本的质量非常高。虽然我没有将此版本作为最终提交,但验证了集成策略的有效性。

感谢所有人!
衷心感谢所有分享公开笔记本和讨论的参赛者,这些资源极具价值。期待在下一次竞赛中继续交流学习。

同比赛其他方案