这是我全力参加的第一个数据类比赛,成绩不谈,重在过程。很感谢比赛中帮助我的各位前辈们,写这个总结的目的主要是为了整理下过去二十多天所跑的思路想法,方便以后查阅,如有错误,希望大家能指正。
- 首先是标点符号啥的是否要去的问题,在这个比赛中,我所做的实验中不去标点要比去标点效果要差一点点,大概是1一个百分比点,用自向量进行的测试 , 去除标点程序
- 去除标点之后就是停用词的问题了,停用词的选取对结果的影响很大,网上有很多停用词库,一开始我直接copy下来就用了,结果效果很差,对于这个比赛,我在使用bigru进行训练时,使用较少停用词或者不用停用词效果比较好。停用词去除
- 处理完上面那两部之后就要考虑数据不平衡问题,对于这个数据集,我们可以发现label2的0指标,以及label19的-2指标很难学到。通过网上查阅资料,对于nlp数据不平衡方法,主要有以下方法。
- 上采样和下采样,即较多的类剪去几份,较少的类多拷贝几份,比较推荐将较少的类多拷贝几份,因为这样不会减少训练数据集,这个的确在validation的时候会体现出来,但是在提交的时候没有很大的提升,不知道是不是我实验次数太少的缘故
- focal loss 在训练时候改变loss函数, 这个尝试后对于这次比赛没有太大的提升。focal loss keras
- 以同义词替换来增加数据比较少的类,较之上采样效果会好一年(To do)
- 以句子为单位来随机打乱顺序(To do )
- 数据增强方法
- 在这次比赛中,我们主要采用的就是将val集和自己模型预测出来的test集都丢入到训练集中再去做训练,在val集上效果很突出,高出了将近两个百分点,但是提交上去之后并没有太大的提升,下次再进行相关比赛的时候会直接考虑KV(即将所有数据分成k份,k-1份训练,1份验证,同样的模型跑k次),以前一直以为k折一般都在机器学习中用,即使是深度学习也只是用来调参,没想到还能这么用。。。。。
- 上面提到的不平衡也是一种数据增强
- 将中文翻译成英文,再翻译成中文,以此来增加数据集
- 置换句子顺序来扩充训练集
- embedding技巧
- 向量主要分为字向量和词向量,训练算法有fasttext,word2vec,glove,字向量比词向量训练的要快,并且简单一些,word2vec比glove训练时间要长一些。(训练程序)[https://github.com/hacker0sean/nlp_tricks_and_strategies/tree/master/embedding]
- 在这个比赛中我主要尝试了下word2vec的字向量和词向量,结果显示字向量会比词向量f1高出大约一个百分点。
- 笔画向量,有人说这个效果很比前面的好一些(To do)
- 特征词,调用百度api,来提取某些关键词,在训练中将这些关键词保留,训练向量,效果没有很明显.代码
- 融合(主要都是加权融合)
- glove,word2vec, fasttext训练的融合下
- 利用cv将不同训练集训练出来的模型融合
- 单模型和多模型融合\