本文以头条问答数据集为例,重点分析了CQA中专家推荐的常用算法,该数据集一共包含三类信息:
专家标签数据:包括所有专家用户的ID,专家兴趣标签,处理过的专家描述;
问题数据:包括所有的问题的ID,处理过的问题描述,问题分类,总回答数,精品回答数,总点赞次数;
问题分发数据:29万条问题推送记录,一条推送记录包括一个问题ID,一个专家用户ID,该专家是否回答了该问题的标注。
下表总结了ByteCup竞赛(https://biendata.com/competition/bytecup2016 )中使用的各个特征,其中++表示该特征特别有效,+表示有效,-表示无效。
ByteCup竞赛中使用的各算法效果如下:
我们将竞赛中使用的CQA专家推荐算法分为四类:
基于矩阵分解(Matrix Factorization, MF)的方法,包括SVD, SVD++, Bidirection SVD++, Bidirection ASVD++;
基于梯度提升树(Gradient Boosting Tree, GBT)的方法,包括GBRT;
基于深度学习(Deep Learning, DL)的方法,包括AutoRec, CF-NADE, Match-SRNN;
基于排名(Ranking, R)的方法,包括Rule和Ranking SVM;
在CQA专家推荐中,基于MF的方法比其他几类方法取得更好的效果。
本文分析了竞赛中前五名使用的特征,总结如下:
我们发现,该竞赛中前5名都使用了集成学习,单一模型并不能在竞赛中取得好的名次。接下来介绍集成学习相关知识。集成学习,就是使用一系列学习器进行学习,并使用某种规则将各个学习器的结果进行整合,从而获得比单个学习器效果更好的学习效果的一种方法。
集成学习可以用于分类问题,回归问题,特征选取,异常点检测等的集成,本文采用分类进行说明。弱分类器是指分类器仅能对少量样本进行正确分类,其分类效果仅略优于随机猜测。强分类器是指对样本分类的正确率很高的分类器。
通过集成学习提高分类器的整体泛化能力有以下两个条件:
基分类器之间具有差异性。如果使用的是同一个分类器集成,集成分类器的性能是不会有提升的。
每个基分类器的分类精度必须大于0.5。如下图所示,当基分类器精度小于0.5时,随着集成规模的增加,分类集成分类器的分类精度会下降;但是如果基分类器的精度大于0.5时,集成分类器的最终分类精度是趋近于1的。
集成学习常见的三种方法是Bagging, Boosting和Stacking。
Bagging用于提升机器学习算法的稳定性和准确性。
Boosting主要用于减少bias(偏差)和variance(方差),是将一个弱分类器转化为强分类器的算法。
Stacking是一种组合多个模型的方法。
Bagging (Bootstrap Aggregating)对训练集采用有放回采样。通过对原数据集进行有放回的采样,构建出大小和原数据集T一样的新数据集T1,T2,T3…,然后用这些新的数据集训练多个分类器f1,f2,f3…。最终分类结果根据这些分类器各自结果的投票来决定。Bagging算法中,基分类器之间不存在依赖关系,基分类器可以并行生成。
Bagging的性能依赖于基分类器的稳定性,如果基分类器是不稳定的,Bagging有助于减低训练数据的随机扰动导致的误差,但是如果基分类器是稳定的,即对数据变化不敏感,那么Bagging方法就得不到性能的提升,甚至会减低。Bagging示例图如下:
Boosting,是一个迭代的过程,每次在新分类器中强调上一个分类器中被错误分类的样本(增加错误分类样本的权重),最后将这些模型组合起来的方法。每次对正确分类的样本降权,对错误分类的样本加权,最后分类器是多个弱分类器的加权组合。
Boosting没有对样本进行重采样,而是对样本的分布进行了调整。Boosting算法中,基分类器之间存在强依赖关系,基分类器需要串行生成。Boosting示例图如下:
Stacking的基本思想是训练一个基本分类器池,然后使用另一个分类器来组合它们的预测,目的是减少泛化误差。
Stacking的步骤如下:
将训练集分成两个不想交的部分;
在第一部分的训练集上训练若干个基本学习器;
在第二部分的训练集上测试得到的基本学习器;
使用步骤3中的预测结果作为输入,将正确的响应作为输出,训练更高级别的学习器。
Stacking示例图如下: