595. Playground Series - Season 4, Episode 1 | playground-series-s4e1
好吧,经过11个月后,我终于进入了Playground系列赛的前三名。我从未想过今年的首场比赛会以如此疯狂的方式结束。毕竟,在3600支队伍中获得第三名,这比我去年取得的成就高出了好几个层次。
事不宜迟,让我来分享我的做法。
IsSenior特征。我也为自己修改了Sun_Geo_Gend_Sal特征。从现在开始我将它称为AllCat。ZeroBalance的新特征,用于指示客户是否零余额。EstimatedSalary和Age都乘以100和10后转换为整数。为什么?你很快就会知道主要原因。但一个有趣的副作用是,仅仅将Age乘以10,与@aspillai笔记本中的分箱代码配对使用时,就会提升效果(这相当于只将Age除以2进行分箱)。在进入集成学习之前,我想先讨论编码,这是获得高性能的关键。我在本次比赛中使用了三种编码器:CatBoost内置编码器、来自category-encoders库的CatBoost编码器和M-Estimate编码器。第一个原因很明显,第二个是因为我还想将CatBoost编码应用于其他估计器。至于第三个,是因为XGBoost和LightGBM不太喜欢过多的CatBoost编码。不过我不会过多解释它,因为它对高性能的贡献不是主要的。
现在,让我们来看看我编码了哪些特征。实际上,让我重新表述这句话。让我们看看我没有编码哪些特征。在原始特征集中,只有Balance和HasCrCard是未编码的特征。其余的?几乎全部编码了。这包括像EstimatedSalary和Age这样的浮点特征,现在你知道我为什么要把它们转换为整数了。另外,还记得我之前提到的特征工程AllCat吗?那是因为我将几乎所有计划编码的特征都连接到了那个特征中,除了IsActiveMember,因为我还编码了IsActive_by_CreditCard。总共有12个特征我进行了编码…或者你以为如此。
还记得TF-IDF向量化和SVD分解吗?其实你也可以对它们进行编码!只需将我对EstimatedSalary和Age所做的操作同样应用到分解结果上即可。需要注意的是,我只对Surname的4个SVD分解组件进行了编码,尽管我还在AllCat和其他一些特征上进行了向量化和分解。
关于编码的另一个重要点是,CatBoost编码实际上非常关注数据集的顺序。嗯,默认情况下不是这样,但你可以这样设置。事实上,category-encoders的CatBoostEncoder会以不同方式处理不同顺序的数据。为了让CatBoost在编码特征时不允许数据集置换,你必须将has_time参数设置为True。那么最佳的数据集顺序是什么?当连接原始数据集和比赛训练数据集时,你必须将原始数据集放在比赛数据集之前。这样会在本次比赛中获得最佳结果。
我在本次比赛中使用了7个模型。
category-encoders的CatBoostEncoder进行编码的最佳模型。在某种程度上,它可以作为指示器,告诉你哪些特征需要为CatBoost进行编码。权重由岭分类器定义。如果你好奇,我在每个模型管道内实现了所有预处理,因为我在交叉验证中是个防止泄漏的狂人。
感谢所有参加本次比赛的成员。希望你们能从这份总结中学到很多。另外,下次我会尝试参与讨论,因为在获奖后我不再有保持沉默的理由(除非我有很大机会获得第一名):)