赛题介绍
AutoNLP2019赛事的主要目的是对自然语言问题的分类任务设计一套general的解决方案,线上线下一共提供了10个数据集,涉及多种nlp任务,本次比赛一共提供了3种baseline方法:
- SVM:传统机器学习方法,以tf-idf特征为输入
- TextCNN:来自于2014年的一篇论文,利用词向量将句子转为矩阵,利用不同size的1D卷积核提取文本特征(可看作n-gram语义信息),经MaxPool后使用全连接层进行分类(sigmoid for 2 and softmax for multi)
- FastText:在TextCNN基础上增加FastText pre-trained word embedding作为Embedding层
以**ALC(Area under Learning Curve)**作为评价指标:
表示最近的一次预测的auc
- 使用
- 根据权重
,初始的权重是最重要的
数据概览
因为是AutoML系列的比赛,参赛者需要提供通用的solution,所以往往会提供多种数据集以检验方案的泛化能力,本次比赛一共提供5(offline)+5(online)+5(stage2)+5(private),20个数据集:
- 多语言:涉及英文、中文
- 多分类:不同数据集可能有2、8、10、30+个类别
- 多种类:数据集中包含情感分析、垃圾邮件识别、新闻分类、论文分类、微博信息分类等多种问题
- 大规模:虽然offline数据集很小,但是online数据集规模较大,最大约有50w+
- 不平衡:大部分数据集类别不平衡现象很严重,某个数据集正反例可达1000:1
因此可以得出以下几点:
- 类别不平衡严重,需要重视采样方法
- 由于评价指标ALC根据时间加权,并且用
log函数进行加权,需要尽早出结果 - AUC不可微,无法直接作为损失函数进行优化,可以使用crossentropy作为替代
Solution
通用的nlp步骤如下:
- 文本预处理
- 清洗数据、进行分词等
- 特征工程
- 传统ML特征(如tf-idf特征, 主要集中于提取关键词)
- 语法、语义信息(词向量word embedding,句向量等)
- 建立模型
- 使用半监督学习的方式利用分类结果
数据预处理
- 采样:针对类别不平衡问题
- 根据kaggle竞赛类别不平衡处理方案,
Result( blending(pred过采样,pred降采样,pred不处理,pred权重) ) > pred不处理 - 总结:针对多类进行欠采样,针对少类进行过采样,一般与不处理的结果进行融合往往有提升
- 其中Tomek link欠采样方式复杂度过高,如果没做任何优化就是O(n^2),建议数据集非常大+类别不平衡时先欠采样再做
- 根据kaggle竞赛类别不平衡处理方案,
- 数据清洗
- 英文:去除标点与特殊字符、统一小写
- 中文:去除特殊符号与乱码
- 对于中文,其实不一定需要分词,因为某种情况下以词/字为粒度效果差距可能不是很大,但是效率差距非常大
- 这边印象深刻的是DeepBlueAI对预处理做的非常细
- 对于数字的处理,1024和1025经过清洗后转为词向量很容易具有差异非常大的语义,因此可采用实现将数字进行分桶的方式进行处理
- 对于email中邮箱号的处理,
xx.mail.com容易被分割,因此需要对邮箱的数据结构进行特殊处理
- 停用词处理
- 根据不同语言选择不同的停用词词典
- 控制文本长度,过短文本保留停用词,过长文本(如数据集中的论文等)直接截断根据最大长度保留前面的部分
对于效率有要求可以使用
Cython提高效率
特征工程
- 传统机器学习方法
- Tf-idf 特征
- N gram
- Word or character n gram
- 这边一定要多尝试,不同参数效果差距AUC可能差3个百分点
- 词频特征
- Tf-idf 特征
- 深度学习方法
- Embedding,如果有效率要求,可以先对Embedding Layer freeze,下一轮再fine tuning
- Bi-lstm提取语义语法信息
模型 & 集成
由于某些原因,我们尝试了非常多种类的模型,但事实证明简单/复杂模型之间的差距并不大,可能最大就1个百分点左右,AutoNLP比赛的第四名benf队伍以往比赛一直采用LinearSVM这次他们使用了LR模型取得了第四
- 模型选择
- LienarSVM
- TextCNN
- TextRNN, Attention等
- 集成学习
- 使用blending方式进行集成
- 由于数据集本身规模较大并且比赛对效率有要求,往往需要进行采样,那么可以按
8:2的比例划分验证集,对每轮训练得到的模型效果进行测试,由此对集成中模型的权重进行调整
- 半监督学习
- 利用上一轮预测信息,将logit大于一个置信度(根据轮数递减)的测试集加入到下一轮训练集中
- 置信度的选择非常重要,不然可能越训练越坏