返回列表

#12th place solutions: My 6 step process for any competition

539. Playground Series - Season 3, Episode 9 | playground-series-s3e9

开始: 2023-02-28 结束: 2023-03-13 数据算法赛
第12名方案:我用于任何比赛的6步流程

第12名方案:我用于任何比赛的6步流程

作者: Andrew Schleiss | 排名: 第12名

我想详细介绍一下我创建的流程,该流程可以重新应用于每场比赛或问题。

这是一个包含所有链接代码的6步/笔记本流程:

  1. EDA(探索性数据分析)
  2. 特征创建
  3. 特征选择(RFECV和手动选择)
  4. 单模型调优
  5. 多模型交叉验证 / 多模型:最佳折
  6. 集成

首先也是最重要的是对数据进行调查,即使在比赛中后期已经有成百上千个EDA,我也更喜欢自己做,因为这让我可以在不受他人影响的情况下深入了解数据。

  • 第2步 是一个专门用于特征创建的独立笔记本,我在这里使用了多种自动化和直观的流程。我最喜欢的是符号回归转换,它尝试对解释目标的特征应用数学运算。非常有趣,但在这次比赛中效果并不理想(在第5次比赛中表现不错)。
  • 第3步 是特征选择笔记本,我提取第2步中创建的所有特征,并对它们运行递归特征消除(手动和使用sklearn的REFCV自动进行)。
  • 第4步 不言自明,我添加了之前创建的特征并尝试优化模型。我不喜欢Optuna,因为它倾向于过拟合,所以我尝试手动完成。
  • 第5步 我获取每个调优后的模型,并运行嵌套交叉验证以及最佳折交叉验证。类似于第4步,只是使用了多个模型。
    注意: 我尝试保存所有验证预测和测试预测以备后用。此外,优化验证预测可以很好地指示模型的性能(注意:不要使用训练预测来进行此操作——尽管对于多模型:最佳折我不得不这样做)。
  • 第6步 是对上述所有测试和验证预测的输出应用集成技术。Scipy Optimize在这里似乎表现非常好,使用线性模型进行校准效果也不错。

我在这次比赛中做的不同之处

我测试了在其他顶级笔记本中发现的额外特征,它们似乎并没有改善我的CV——但我认为我在这一点上错了。

我最终使用的方法是按列对训练集中的重复项进行分组,并获得一系列目标值。
然后通过将这些目标值用作分箱来创建特征。

这里的想法是,重复项具有不同的目标,所以为什么不使用每个分组的目标平均值呢。

def Additional_Features(df_in):
    df = df_in.copy(deep = True)
    
    for col in df_test.drop("is_generated",axis =1).columns: 
        grp_target = df_trn[df_trn.drop(target,axis =1).duplicated()].groupby(col).mean()[target]
        if 0 in grp_target.index:
            bins = list(grp_target.index)+ [max(df_trn[col])+1]
        else: 
            bins = [0] + list(grp_target.index)
        
        #add cols
        df[f"{col}_grp_mean"] = pd.cut(df[col], bins=bins, labels =grp_target.values )
        df[f"{