Santander是西班牙的桑坦德银行,作为主办方在kaggle上举办了他们的第二次匿名数据竞赛,参加队伍数高达9038,反作弊检查之后剩余8800,总人数超万人,这是kaggle历史上参赛人数最多的比赛,和队友用最后一周半的时间,拿下了12/9038,按照他们PR的一贯套路是华人第一,然而并没有什么意思。在结束后写点干货,让你尽快找到竞赛中不一样的东西

Santander Customer Transaction Prediction

匿名数据竞赛,顾名思义,匿名数据竞赛是所有变数丧失原有的业务含义,所有变数可能经过了脱敏变换。选手很难从业务角度去寻找突破口。整个比赛非常刺激,大家都在沉迷于寻找magic,于是乎我也手痒痒,加入其中。寻找Santander留在数据海洋中的one piece。

今天让我们抽丝剥茧,还原一下案发现场,华山论剑,看各路Grand Master过招。(在这里顺便祝贺我的朋友 @砍手豪 拿下了GM,现kaggle全球排名14 / 1 millon +,有感兴趣的猎头可以私信他了)

说起数据敏感性,可能每个投演算法工程师的人,在校招简历上都会写「数据敏感」,这是个玄而又玄,就像责任心强一样...抛开玄学和自吹自擂,如果你和我一样,没有所谓的敏感性天赋点加成,能否通过严谨的推论,数据分析,画图,从现象看到本质呢?

让我们一起看看,藏在数据海洋中的one piece到底是什么。

线索一: GBDT的参数和收敛现象

GBDT的参数和现象表现的很奇怪,具体有如下,收敛很慢,0.001的学习率下,两万多轮收敛。过拟合非常严重,在train上高达auc==99+,验证集的auc又不高。 earlystop非常大。似乎表现出非常强的非线性。

线索二: 从特征的KDE看起来似乎很简单

看起来似乎非常规整的分布,在图上某个范围表现出非常强的可分性。跟我们第一条的推论冲突。大部分如下图所示,隐隐约约感觉一+二能发现点什么。

线索三: shuffle数据不影响结果

初步推断,特征之间正交,几乎没有corelation。印证方法,对每个变数分开算模型,然后连乘,用朴素贝叶斯的方法,几乎不影响性能。

线索四:全部是float,部分表现出高频重合,似乎又满足稀疏category的特性

似乎包含某些频率隐藏之下的信息,至少没有表现出来都是浮点数的特性。

线索五:测试集里面有人造数据

制造方法已经被大佬公布,具体可以参照链接。(这个人真是太厉害了,简直是个天才)。

下面进行推理,结合实验进行验证。

线索一 + 线索二:表现出非常强的非线性,然而kde又非常漂亮。魔鬼隐藏在细节之中,kde这种基于估计的方法,如果窗大小太小,细节会被抹去,我们画图观察一下高频的局部细节。

问题出现了,正态分布中间出现了不少低频,这些低频似乎有所共性。从信号的角度来讲,杂讯符合低频,方差小,平稳的特点,我们做一些实验。我们通过把所有count==1的干掉(替换NaN)。

通过在训练集上测试,我们终于突破了902,不过似乎并没有LB上表现的那么强劲。加上test会变得更差。等会,别忘了test中有些假数据,干扰了统计,干掉他们,这时候已经发现了一半的magic,基本可以踏上新航线的征途。

如果说这样你很难理解,那么让我通过可视化的方法,福尔摩斯之思维殿堂来还原一下案发现场。

于是你画出了如下的图。

嗯,看起来很好,很简单,正负样本分布不同,直接怼进去。

好了,恭喜你,用尽一万种方法,还是baseline的水平,超越不了901。

如果你结合线索一和线索二,仔细想一下,我们打开了显微镜,于是画出了如下的图。

等等,正态分布的中间为什么掺杂了低频,他们的统计意义是否足够强?模型为什么在这里纠结了那么久才收敛,而且那么容易过拟合?

真相就是,低频,有著不同的表现。我们已经处理过count==1的情况验证了。

我们把count 和 value 还有target一起画出来联合概率分布。

好了,真相浮出水面,p(target|count)表现出了一定的线性。p(target|count,value)刻画的不错(颜色成团,不是随机)

那么接下来问题来了。

1.结合我们对count==1的处理,那么这些count >= 2的就真的一模一样吗?

2.这些count 都等于1的在峰的左边和右边真的一样吗?

3.低频区和高频区的count==1真的一样吗,答案显然,不一样。

让我们尝试通过特征工程仔细刻画一下。

那么接下来的问题是,特征工程到底是什么?如何做呢?

答案:把模型看不见的东西,通过feature表现出来。一般情况下,会用非线性三个字概括。

这里的非线性存在于哪里呢?

答案:低频区域的低频和高频区域的低频都有所不同,峰的左右都不同。

所以,我们选择的刻画方法是,count / dist 这样一个交叉特征衍生构造。这样就能表现出低频区域和高频区域的count特征的不同。

dist可以选 var-var.mean/max/median/mode/cumprob/1-cumprob。用这三些可以突破923,仔细做做就能突破924甚至925。

至此,你大概能体会到,如何通过模型反馈,EDA来做一些分析,然后再反馈到特征刻画,最后再用来提升模型。

总结一下,无非三点。

1.fake data干扰了统计(特征的正确性)

2.真实浮点数频率背后隐藏了信息(模型无法学习直方图的列高,只能学习横轴,理解一下)

3.频率和距离的交叉会衍生出更好的刻画。(count千篇一律,magic万里挑一)

其实还有第四点

4.控制模型,让GBDT的学习,尽可能优先地在他的衍生和他的原始值上进行。或者是对单个特征和他的衍生单独建模

这个手法表现出来就是,有一个kernel,把count==1替换掉,复制两倍(影响了采样率),效果会特别好。

关于论坛上值得看的,我觉得是这个。这个题决定金牌的是magic的特征/参数/模型,决定能不能拿奖金的是NN。其他的都差不多,不过大家分析的一些奇怪的现象和实验,都可以复盘一下,收获很大。链接如下

NN wo pseudo, 1 fold seed

一家之言,欢迎拍砖。

感谢队友,daishu,thluo,Q。

推荐阅读:

相关文章