kaggle-avito赛后总结

很久前看别人的博客说过了一句话,大意是“特征决定了系统的上限,算法只是在不断逼近这个上限”,可见特征的重要性。实际参赛后感觉,对机器学习而言,特征非常重要!!!

第一次参赛,虽然只打到12%, 但心情很激动,赛后结束的第二天简单写了些感想,可惜最近没有时间继续比赛了。

一、感想

记第一次参加比赛的经历,虽然成绩一般,但是依然很兴奋。

1.随想

kaggle是个非常有意思的地方,社区很活跃,有非常多的交流,几乎每个热门的讨论帖都值得认真学习,然后去实践你的思考。学到很多,从实战中学习,感谢kaggle,很多人都在讨论和分享他们的想法,当然最后胜出都需要一点自己的idea。

最早刚做完Titanic的练手,发现有还剩1个月的比赛,然后尝试一下实际的比赛-avito

这次比赛的特点,avito这次比赛有点集成的风格,为什么说是集成呢?几乎包含了大部分类型的数据,分类(categorical)、数值、图片、文本,因此涉及到文本处理、图像处理以及常用的数据处理,数据量足够大,所以基本上后期的方法分为机器学习的lgb和深度学习NN,以及最终的模型融合stacking或者blending。以前就有人说过,其实受限于硬件(是否有GPU)的影响(也即是否具备做NN模型以及处理图像的能力),使得kaggle的参赛人员数量差异很大。这一次最终队伍有1917,数量适中,现在可以看到最新的比赛都上3000多人了。

参赛的前期都是熟悉其它人的思路,而最为激动的是后面构造feature的时候,有很多想法需要来实现,虽然最终没有得到很好的成绩,不过很有趣。

关于硬件,比赛体会很深一点是,一定要有一台配置好的电脑,不要让硬件限制你的想象力,learning rate设置为0.01,内存小于16G,当时PC直接跪了。后期加feature时,这个尤其重要,随便跑上7、8小时都有可能。

google colab和kaggle的对比,kaggle提供资源给用户自建kernel,在内存上,kaggle的无GPU情况下配置17G内存,如果用gpu,内存和colab的差不多约14G左右,所以运行大量数据的时候可以用kaggle的高内存跑。(不过这次比赛,在TFIDF时设置了量大一点的特征在colab跑,直接死机,而kaggle能持续运行。)在运行时限上,kaggle有6个小时的kernel的运行限制,超时,自动停止kernel,colab貌似没有。根据需要,自行选择。这次比赛就是用kaggle的gpu做简单的loop提取了所有图形特征。

2.知识的理解

看再多的书,不如来一场比赛对知识的理解更加透彻。就会知道哪些知识是必要的,哪些仅作了解。

回想当初看pd作者的《Python for Data Analysis》2nd,看完后始终缺乏深刻的认知,如果不用,估计不到一周,会全部丢掉。在比赛中,后面自己做feature的时候,绞尽脑汁想怎么用pd中的功能来完成自己的的需求,构造出新的feature,在解决问题的过程中,逐步加深了对pd的理解和应用,不得不惊叹pd的强大,不愧是ML必备利器。

然后再次回顾学习ML这一路所走过的知识点,会发现那些是欠缺的,哪些还理解不够。NN的知识需要加强,虽然现在kaggle上主流还是lgb,不过NN逐渐在比赛中扮演重要地位了。

二、赛后学习

赛后的学习收获很大。下面赛后各获奖队伍在讨论版块的总结(深入理解后会持续更新),很多未考虑到的,需要学习、学习、再学习。

参考链接,建议看原贴,会有不一样的理解。avito讨论区

4th解答

1.模型融合

stacking用的model,建议一开始就做好model,后期将时间放在特征上面。

融合的model,LR、GBT、NN、XGBoost、catboost

融合的方法,Nonlinear stacking and including features for stacking definitely helped(非线性融合以及融合加入重要特征)

2.特征工程

做出新的特征后,进行特征相关性分析,排除相关性过高的特征

特征处理算法

3.文本处理

4th的分析,500 for SVD, 30000 for kmeans, 50000 for tfidf.

TF-IDF(3-grams )——>SVD,

LDA,

word2vec —— fasttext,

k-means

LDA和SVD的区别

监督学习,线性-LDA**(Latent Dirichlet Allocation)** 用于文本挖掘模型,对topic-word,topic-doc进行了建模 ,投影后类内方差最小,类间方差最大 ,LDA需要考虑label,

SVD(Singular Value Decomposition )用于矩阵分解(matrix decomposition ),压缩矩阵

无监督学习,线性-PCA:降维,去相关;只用于方阵 ,实现SVD也实现了PCA。

通过SVD可以得到PCA相同的结果,但是SVD通常比直接使用PCA更稳定。因为PCA需要计算X⊤XX⊤X的值,对于某些矩阵,求协方差时很可能会丢失一些精度

通常LDA优于PCA

img

再扩展说说t-SNE,参考知乎,主要针对无监督学习和非线性特征,通过视觉直观验证算法有效性t-SNE比较适合可视化,了解和验证数据或者模型 ,可以认为它用于辅助分析,认识数据,但不直接用于分类。

4.NN

这块需要加强学习,biGRU,two stacked, bidirectional GRUs,(biLSTM for texts and a simple 4 layers CNN for image)

3.算法tips

聚类,kmeans,(这个是没有想到,后期做特征只是用了图片分类来进行价格的ranking,粒度还是太低了),91th后来提供了一种更快的kmeanshttps://www.kaggle.com/c/avito-demand-prediction/discussion/59881,https://github.com/src-d/kmcuda

lgb算法中的,categorical feature 参数,如果特征过多,lgb可能很难发现它们的差异性(这时候去掉这些分类特征参数可能提高cv分数),针对分类特征少时候可以用。

lgb算法中的num_leaves,4th的joe Eddy使用了400,通常都是浅树,depth最高到8,num_leaves小于2*depth,主要是因为各个特征有交叉性,看原文。他后面的想法很好,实践出真知,通过实践,当验证的效果不再提高后,寻找最佳的参数,有点类似early stopping的思想。(我实际中最高用了300,后面担心过拟合,降下来260、220都用过,确实发现叶子树少了后,RMSE变差了,不过叶子树变多,learning rate=0.01,使得训练的时间也变长,后来就没有尝试更多的叶子数量,反而的,加了l1和l2的正则来防止过拟合,理解得不够,后来看其它人的文章,这个num_leaves的值是个关键,如果设置得更高,说不定就能冲上去了)。

NFOLDS,这个是理解了很久,的确是stacking过程的一部分,只用一种模型,留一后,对test预测的均值。实际跑下来,RMSE下10folds比5folds高0.0001,不过10folds太耗时了,通常5folds足够。

分类特征平均树编码处理,参考CV & Time-Series Split Target Encoding and some other codes 以及中文说明针对高基数定性特征(类别特征)的数据预处理/特征工程