2017 知乎看山杯机器学习挑战赛是一个文本多标签预测分类的比赛,属于NLP(自然语言处理)的范畴。它提供了300万训练数据,24万左右的线上预测数据。需要你从1999个话题分类标签里,为每个问题抽取5个最相关的话题。为了防作弊和隐私安全考虑,提供的文本数据都做了特殊转换和词向量化。这些处理都为比赛带来了一定的技术门槛。知乎比赛传送门:https://biendata.com/competition/zhihu/leaderboard/
对于我这样的NLP的初学者(参赛前只做过几个NLP的例子程序)来说,刚开始被这些特殊处理过的文本难住了。以往的经验都是拿到中文文本,先使用结巴分词这样的工具去除停用词,然后分词抽取。这样得到的内容你想怎么处理都方便。现在这块没掉了,看到像'w1','w2'这样的数据,真地头疼。说实话,国内的比赛很缺乏对初学者的照顾,不像国外的KAGGLE比赛,经常有前辈给初学者提供一些如何开始比赛的程序或者建议,让初学者也能顺利地完成比赛。所以,我看到知乎比赛有将近900个参赛队伍,结果只有200个左右的队伍提交了成果。我估计有很多初学者都被技术门槛卡住了,没法做下去。
因为这个比赛是我第一次参加机器学习比赛,所以我坚持了下来。在尝试了多种不同的工具和模型后,得到了一些东西,并记录下来。
比赛第一阶段:
文本未经处理,直接送模型处理。例如,直接把’w1,w2’这样的文本信息送到RNN或者MLP进行训练处理。这样处理的结果,test准确率只有千分之4到百分之4. 这就是比赛排行榜上末尾看到结果。就因为这样,很多初学者放弃了比赛,结果太难堪了。
第二阶段:
把’w1,w2’这样的文本信息分别转成256维的词向量,然后把词向量累加再求平均值。经过词向量平均值处理后,再送到MLP、RNN、 SVM等模型进行处理,test准确率在13%到23%之间。其中,linear svm准确率最高,泛化能力最好。
第三阶段:
把’w1,w2’这样的文本信息分别转成256维的词向量后不再求平均值,而是用词向量依次排列组成句子,再送到双向LSTM+GRU模型处理,test准确率提高到了27.3%。这个模型的缺点是消耗大量的GPU内存,只能用词向量组成40个词左右进行训练,否则,6G的显存都不够用。
使用投票法则,把前面只有百分之20几准确率的十几个模型集成起来,一起预测。线上得分刚好超过30%。
第四阶段:
听一些搞NLP的前辈们说想要拿高分,只有用ATTENTION模式。据说有人用ATTENTION模式训练出单模型40%准确率的。
我水平有限,搞不出能用的ATTENTION模型,只好参考别人的代码。参考开源的https://github.com/ilivans/tf-rnn-attention
把’w1,w2,w11’这样的文本信息做处理,去掉前面的’w’字符,变成’1,2,11’这样的数字,然后送到RNN+ATTENTION模型处理。这个模型得到的test准确率在30.6%左右。
再次用投票集成的办法,得到了线上成绩32%左右的结果。
这次比赛,我尝试过的机器学习工具包括:sklearn、mxnet、tensorflow、keras、xgboost、lightgbm等等。感觉最容易使用和最有帮助的是sklearn和keras,最难用的是tensorflow。用tensorflow实现模型,评估模型和预测都非常麻烦,都要自己写,缺乏效率。 Mxnet写的程序性能很好,但是真地太缺乏例子和文档了,我用它写不出来RNN+ATTENTION模型,浪费了。
知乎比赛还有15天就结束了,我也不打算再提交了。等到比赛结束了,看看有没有大神开源他们的方案。如果有的话,要好好看看他们是怎么做的。我很好奇能达到42%准确率的方案是怎么搞出来的。