1. Abstract
本次Kaggle比赛是做NLP的情感分类,要求我们将六种不同的情感分类找出来(toxic(恶意),severetoxic(穷凶极恶),obscene(猥琐),threat(恐吓),insult(侮辱),identityhate(种族歧视))而这些label并不是互斥的。这是我第一次参加的Data mining的比赛,误打误撞拿到了铜牌,算是个不错的成绩吧。虽然比赛结束了一段时间了,但我还是需要对之前比赛的工作做出一些总结,也为日后的实验工作累计经验。
2. Main work
2.1 Data Clean & Data analysis
首先这个比赛当中,数据集看起来挺干净的(没有任何的na值),里面全是id,文本和各个label。但通过baseline模型分类找出分类错误的一些样本中,我们发现其实这些评论是很“脏”的。评论当中不仅仅是英文还有日文和一些他国语言,文本中还会掺杂一些html标签。因此在做一些文本处理是需要先清洗一下这些评论的。另外我们会发现评论中为了避免“文本过滤”,那些恶意评论都是FU****K,但显然这些都辱骂的词语,流露的情感都是toxic的。这也是NLP里面的一个问题oov(out of vocab)。因此我们需要对这些词语进行不抓和清洗。
2.2 Feature Engineering
在Feature Engineering中,我们使用一下这些特征:
TF-IDF:我们不仅仅针对word,而且还对char做。对于char而言可能存在一些常出现的字母组合,因为一些关键字通常会给评论者通过拼写错误来让系统过滤器混淆,使用char某种程度可以捕抓到这些字词。
统计特征:我们统计了一下comment的长度,标点符号的个数,评论词数与评论单词总数的比值等等。它用于补充了TF-IDF不足的东西。
trained word2vec:有两种word2vec,一种是GloVe,另一种是FastText。他们主要是用于做DeepLearning的使用使用的。
2.3 Model
首先,我使用LR做一个baseline来精度如何。最后我们使用了NB-SVM,LGBM, LR, NN做了模型并融合。对于NN,我使用了BI-GRU,CNN,BI-GRU -> CNN,发现Bi-GRU CNN单模型效果最好,但是在融合的时候并没有什么另外两个融合效果好。通常来说,RNN在做文本的效果比CNN好,主要是因为CNN会丢失到文本当中的时序信息。
2.4 Other ticks
我们在做数据分析的是否发现数据是及其不平衡的。我记得其中一个label只用400多个正样本,而其他10w+个都是负样本。所以data augmentation是十分重要的。有大佬使用了TTA,其实他就是把文本翻译成其他语言,使用不同的语言来做预测,这种做法提高了模型的泛化能力同时也增加了训练的正样本。
另外在比赛中我们发现了,训练集和测试集两者的分布有所不同。所以有些朋友使用pseudo-labelling来解决,pseudo-labelling是一种半监督训练方法,简单来说就是先对test集做预测,然后使用test集和部分的train集合做训练,用validation数据做模型评估,最后得到模型对test集做预测。
3 Other solution
- 35th 关于做详细做FE:https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52645
- 这个是关于FE的kernel(受其启发,加入一些统计feature):https://www.kaggle.com/eikedehling/feature-engineering
- 一般word2vec就仅仅对word,而加上char做deeplearning效果会更好,就像char tf-idf:https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52702
- 15th 通过使用BPEmb和Spell Correction来尽可能解决oov的问题:https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52563
- 对此比赛的总结:https://zhuanlan.zhihu.com/p/34899693
- 一位大佬的做法和总结:https://zhuanlan.zhihu.com/p/34922134
4 Summary
这次是我第一次参加Kaggle比赛同时也是第一次做NLP项目。个人提升还是挺大的,因为这个比赛我认识了解了XGB和LightGBM这些模型武器。当然最重要的是在kernels上面不停的偷师抄代码。当然我发现自己对文本数据的敏感度不是特别够,如Fuck这类词出现的次数其实还是很多的,所以在tf-idf里面idf会将其权值降低。因此我们需要显式提取这类词语。另外我对评估features的重要性还是不够,因为feature过多会增加训练的时间复杂。我现在只会一些用cross valid和corr来评估哪些features是比较好的。另外我认为kaggle上面的比赛应该多看kernel和forum,因为里面真的给到很多建议我且讨论到一些很多关键点。