kaggle比赛_Kaggle-QIQC 比赛总结

萌新第一次参加文本比赛,本来是不想参加的,不过正巧看到Joe大佬搞的一个活动,抱着向各个大佬学习的心态。(感谢AI圈举办的这个活动,确实不易)

kaggle果然是一个很好学习的平台,公开的kernel很有意义,让我这个小白迅速学习了基础。只是要想成为大佬还是要看比赛结束后的开源代码。

如果想混名次感觉后几个星期再加入会少弯路,但是学东西的话,看很多从头跟这个的分享都说自己体会到了文本分析的一个缩影。(rule->svm->xgb->nn)

一.赛题分析

QIQC如它名字,是对英文短文本进行二分类,将文本分为“真”或“假”两种结果。这次比赛仅可以线上提交并运行,使用Kaggle提供的运行环境,如果使用GPU进行运行,限制运行时间为2小时,同时提供了四种预训练好的词向量供参赛者使用。

二.参赛历程

先是fork了群里给的baseline

nlpjoe:如何到top5%?NLP文本分类和情感分析竞赛总结​zhuanlan.zhihu.com
kaggle比赛_Kaggle-QIQC 比赛总结_第1张图片

然后重头仔细看代码,kernel上的预处理讲的是真的好

如何进行EDA的分析

Simple Exploration Notebook - QIQC​www.kaggle.com

如何利用预训练词向量

How to: Preprocessing when using embeddings​www.kaggle.com

然后自己就开始缝缝补补尝试了。

改参数:

  • 取词数增加:没用,超时,只要保证句子截取的时候能保证覆盖90%以上的词数即可。
  • 增加hiddensize:线上线下增长有轻微不稳定,但是斯坦福的课程说hidden_size增加越大越好,我也觉得肯定会有提高,只是会超时(emmm)。
  • split数和epcho数:epcho从运行来看会出现抖动,但是改,分数也没有提高。而且split=4 epcho=5听起来感觉很合理了。

新的特征:

由于预处理的kernel可以看出有真假句子其实有些词是会有很明显的区别,所以想利用转化率的概念,计算每个句子词的转化率平均值。(1-gram,2-gram,3-gram)

  • 放网络里面训练效果不好
  • 放网络外面,利用一些线性回归(rcv,bycv)重新训练

效果都不是很好。感觉上,对于rnn的这些神经网络把特征直接放在里面训练是不是会不是很好,但是后来看一些论文,其实是可以的。然后如果想用神经网络的结果做第二次预测的方案的话,除非结果很准(stack),或者特征很多。特征数太少难怪没用。

基于这条思路我还有一个更蠢的想法,把一些英文里面的敏感词提取出来,直接去标它为假的后处理。

  • quora太强,怎么把dick放入gang门,怎么样可以suck自己的dick,这些问题竟然真的可以搜的到,属于真。
  • 词向量上同义词还有提升的空间。有些表达一样的,只是换了同义词,模型就判断错误了。

然后,吸取之前的一些比赛经验,不关特征是啥,rank排名上一下,把特征转为排名避免一些大小的差异,分数上了0.701。

改train-test:

原kernel对于提供的词向量取的是120000个词,也就是说会去掉很多低频词。而根据新特征的思路,为假的句子里面会有很多能够代表他们的词,尤其是对于test数据集这么小的情况下,大部分词都会只从训练集里面来,我觉得可能会不公平。所以把数据集变为

[test全集,假句子全集,真句子(60k)],有千分位的提高。

改网络:

萌新企图想改别人这么做这么久才做出的网络,那结果还是可想而知。不关怎么拆,怎么加都没有提高。

  • bi双向真好用
  • 注意力机制真好用
  • 池化机制(avg表达句子的通顺和max表达最关注的内容)
  • BN和dropout靠运气能上分(一般最后一层都要BN一下)

在CNN里面学的池化,没太弄懂rnn里面的avg和max

至于胶囊网络和cyc的加速,没时间来的及学习了。

换embedding:

直接在起始状态用提供预训练词向量的一个或是几个mean,这些大家都尝试过。

要谢谢博主的分享,其中提到可以在训练的过程中每一折去用不同的预训练词向量。自己就尝试每一种预词向量都训练,然后每一折都取最好结果的词向量。

会出现问题,每一次训练的Loss都会变化,所以每一折都取最好的,最后合出来的效果并不好。而是选择较稳定较优的会更好,就是采取了博主里面的说的glove embedding * 2fold + mean three embedding_matrix *3flod

NLP小白的Kaggle一轮游总结 - gdufsTFknight的博客 - CSDN博客​blog.csdn.net
kaggle比赛_Kaggle-QIQC 比赛总结_第2张图片

调阈值:

对于二分类最后的阈值,原kernel是找到训练集的最合适的位置,但是很明显1306k找到的阈值,与56k对应的阈值应该是不同的,而且前者的阈值应该会偏低,因为要照顾更多的假句子(在临界值附近为不会出现大量的真句子)。所以就手动的提高最后测试集的阈值。果然有了提升。

好的trick:

别人的网络感觉只能借鉴,一模一样的网络,会有好的效果应该不可能,但是下面提到的trick感觉很有用。

在文本分类任务中,有哪些论文中很少提及却对性能有重要影响的tricks?​www.zhihu.com

最后有效的操作:

  1. frok:0.699
  2. rank旧特征:0.700
  3. 调阈值:0.702
  4. 改train-test:0.703
  5. 换seed:0.704
  6. 不调阈值,换embedding:0.702 并且线下最高

在原始的评价榜上,一度冲到了前1%,即使最后换了测试数据,在public榜上也在前4%。

但是可惜,因为之前的操作都是针对少量数据调阈值,而改train-test的操作取了test的全集376k,这样把训练集的太多词冲掉了。最后private榜掉到500多名,连baseline都比不过了。。。

所以public榜好还不行,还是要多想到换了数据集的情况下,结果是否会稳定,才能确定操作是否是有效的,自己多做测试。

你可能感兴趣的:(kaggle比赛)