2016CCF大数据与计算智能大赛——搜狗用户画像比赛总结

一,赛题介绍

赛题提供10万个用户在一个月内的搜索引擎查询词,与该用户的属性标签(包括性别、年龄、学历)做为训练数据,用机器学习和数据挖掘的方法构建模型,去对新增用户的未知属性进行预测(已知信息即用户的搜索词),其中性别是二分类问题,年龄和学历都是六分类问题。

赛事官网为www.datafountain.cn,比赛自16年10月开始,历时两个月。
我们队伍最终排名为30/894,B榜准确率为0.69953。

二,思路概述

这是一个文本分类问题,我们的思路是:

  1. 先对训练集做特征工程,包括数据预处理,分词,特征选择。
  2. 结合词向量工具word2vec进行特征的优化。
  3. 尝试不同的分类模型,并进行模型集成(ensemble)以提高精度。

三,特征工程

  1. 预处理
    首先观察一下我们拿到的训练集:一行代表一个用户,前三列信息分别是性别年龄学历的数值化表示,有空值,最后一列是该用户的搜索语句,多个搜索以制表符分割。我们先对空值做一下预处理。对于空值的处理我在另一篇博客中有介绍,详见Kaggle比赛经验总结之Titanic: Machine Learning from Disaster
    我们这里的处理是丢弃所有包含空值的行,因为我们认为被丢弃的数据占比太小,影响不大。不过在赛后总结中我们觉得也可以用预测填充的方法试一试效果。

    另一个预处理步骤是自定义词典,简单说就是把文本中出现的一些词进行替换,比如某网盘地址的链接,我们把它替换为“网盘”,“神雕侠侣”替换为“武侠小说”等等,我们认为标签化对于分类更有帮助,但因为人力有限,具体实现起来很难。

  2. 分词
    分词几乎是文本处理必备步骤,我们这里使用了结巴分词。我们的训练文本属于搜索语句,它有2个特点:一是它很短,一般是一句话或一个词就完了;二是它不规范,体现在错别字多而且语法不对。
    针对上述问题,同时给我们下一步选择特征做铺垫,在分词时我们按照词性进行分词,同时进行去停用词处理,包括字母数字和无意义词(比如“什么”,“怎么”等),结果仅保留名词,因为我们通过观察数据,发现对于分类帮助更大的词基本都是名词。说实话这是一个很粗糙的做法,因为损失了很多信息,但是也在某种程度上为后续的特征选择做到了降维的效果。

    我们在赛后总结中也根据别人的做法学习了分词阶段可以尝试的方法,比如分词后设置一个窗口大小,词与词组成二元词,这样可能信息表达更丰富;再比如把用户搜索时输入的空格也作为一个词看待,因为这些人使用搜索引擎更加熟练,可能表示了很强的类别特征。

  3. 特征选择
    先介绍一下TF-IDF:它是一种常用的文本特征加权方法,广泛应用在信息检索领域,它衡量了某一个单词在文档中的重要性。现在假设一个语料库中有多个文档,TFIDF与一个词在文档中的出现次数成正比,与该词在整个语料中的出现次数成反比,公式为:
    TFIDF(w,d)=TF(w,d)*log(N/DF(w))

    我们选取的特征表示方式是传统的One-Hot方式,具体是先构建一个词典,它包含所有我们选取的特征词,然后对于用户的每一个搜索词,如果它在词典中出现了,对应位置就标记为1,否则为0。最终每一个用户的特征表示就是01序列,长度为词典长度。其中特征词的选取采用TF-IDF的思想,词频上的处理是删掉出现次数小于某一个值的词,以减小生僻词的影响;同时计算单词在某类特征的不同取值之间的离散程度(方差),过滤掉方差小的单词,以减小大众词的影响。

    特征选择是很重要的一步,我们因为经验不足,这一步还有很大提高空间,比如使用卡法检验来选择特征,或是直接用TF-IDF的权重矩阵当做特征表示而不是用One-Hot,因为这样可以更好的结合词向量,详见下一部分。

四,词向量word2vec

简单介绍一下word2vec:传统的One-hot表示方法不能表示出词与词之间的相关性,一种分布式向量表示方法解决了这个问题,词语之间的相似性可以由向量的余弦夹角表示,word2vec就是把词表示成这样一个向量的东西。这里知道它可以生成一种词的分布式向量表示,以及可以找到一个词的最相似的词就可以了。

经由上一步特征选择,我们得到了自己的特征表达,是高维稀疏的特征矩阵,接下来我们用word2vec寻找最相似的词进行语义填充,丰富特征表达。具体做法是:当我们在判断用户的一个搜索词在不在字典中时,如果不在,先不标0,通过word2vec去找这个词的最相似的词,结果会返回若干个词,如果存在某个词的相似性大于某一阈值,且在字典中出现,那么标1。
我们的直接目的就是尽可能的消除0,准确度有提升,但不是很高。我认为原因主要是word2vec是无监督学习,准确度本来就差一些,再加上搜索词这类文本的上下文相关性比较弱,导致词的相似性判断效果不好。当然最主要的原因是我们没有理论支持,纯是拍脑门想出的方法。

在赛后总结中我们学习了高水平队伍的做法,发现其实可以直接用word2vec训练出的词向量表示当做特征,求一个平均得出文章向量即用户向量,再融合到TF-IDF特征表示中,这种词向量加TF-IDF的特征表示效果很好,既没有稀疏问题,特征表示也更丰富了。当然还可以把LDA向量特征和doc2vec向量特征用同样的方法都融合进来,除此之外,也可以加入统计型特征,如用户搜索词数量、英文搜索词数量等。

顺便提一下高维稀疏这个问题,有些场景下我们是需要稀疏特征的,因为它相当于去噪声,表达更精确,虽然有些模型对高维稀疏的训练效果不好。高维的话可以看这篇文章:点我,简单总结就是当样本量不变时,维度越高越容易过拟合,所以维度增长时样本量也要对应增长。

五,分类模型与集成

我们在实际中尝试了几个流行的分类模型,如随机森林,GBDT,SVM和神经网络。前期随机森林表现出色,速度与准度兼顾,而SVM在特征维度很高时训练得极慢,后期接触了神经网络之后,仿佛发现了新大陆,我们的最终成绩也是由最简单的MLP神经网络得到的。
赛后我们学习了获奖队伍的stacking模型集成方法,简单说就是先用几个常用模型去训练,得到对应预测结果(我猜测可能是概率表示),然后把上一步中计算出的用户的各种向量特征加进去,把这些作为训练数据,再用模型去训练。

具体可看这篇文章:传送门

六,赛题难点

  1. 数据噪声大。在一个家庭中多人共用一个搜狗账号的情况很常见,该账号的用户属性和搜索内容不能很好的对应。神经网络对噪声容忍度相对较好。

  2. 数据不均衡。我们最后预测的结果中没有一个博士,实际上训练样本中的博士就很少,其它标签也有类似情况,我们的处理是抛弃训练样本中的博士,做法比较糙,关于数据不均衡可以看看这篇文章:如何处理分类中的训练数据集不均衡问题

我组大神的代码仅供参考:点我

你可能感兴趣的:(数据挖掘机器学习实战)