一、引言
在现实生活中,有许多只有正样本和大量未标记样本的例子。这是因为负类样本的一些特点使得获取负样本较为困难。比如:
负类数据不易获取。
负类数据太过多样化。
负类数据动态变化。
举一个形象点的例子:比如在推荐系统里,只有用户点击的正样本,却没有显性负样本,我们不能因为用户没有点击这个样本就认为它是负样本,因为有可能这个样本的位置很偏,导致用户没有点。
因此,有研究人员开始关注PU Learning(Positive-unlabeled learning),即在只有正类数据和无标记数据的情况下,训练binary classifier。PU Learning是半监督学习的一个重要研究方向,伊利诺伊大学芝加哥分校(UIC)的刘兵(Bing Liu)教授和日本理化研究所的杉山将(Masashi Sugiyama)实验室对PU Learning有较深的研究。他们在AAAI、NIPS、ICML等*会议上发表了很多关于PU Learning的文章。详细见参考文献【3】【4】。
我们在本篇博客中重点介绍常见且实操性比较强的PU learning的技巧。
二、PU learning的一些技巧
人们对PU learning的方法一直非常感兴趣。 由于标准机器学习问题(利用大量正面和负面样本用于训练模型)有了充分的发展,因此在监督学习的基础上,有许多方法经过巧妙调整可以来进行PU learning。
下面对这些技巧进行简要的总结。
2.1 直接利用标准分类方法
直接利用标准分类方法是这样的:将正样本和未标记样本分别看作是positive samples和negative samples, 然后利用这些数据训练一个标准分类器。分类器将为每个物品打一个分数(概率值)。通常正样本分数高于负样本的分数。因此对于那些未标记的物品,分数较高的最有可能为positive。
这种朴素的方法在文献Learning classifiers from only positive and unlabeled data KDD 2018 中有介绍。该论文的核心结果是,在某些基本假设下(虽然对于现实生活目的而言可能稍微不合理),合理利用正例和未贴标签数据进行训练得到的标准分类器应该能够给出与实际正确分数成正比的分数。
2.2 PU bagging
一个更加复杂的方法是bagging的变种:
通过将所有正样本和未标记样本进行随机组合来创建训练集。
利用这个“bootstrap”样本来构建分类器,分别将正样本和未标记样本视为positive和negative。
将分类器应用于不在训练集中的未标记样本 - OOB(“out of bag”)- 并记录其分数。
重复上述三个步骤,最后为每个样本的分数为OOB分数的平均值。
这是一种bootstrap的方法,可以理解为之前我们会想到随机抽取一部分未标记样本U作为负样本来训练,在这里会设置迭代次数T,根据正样本的个数,每次都随机可重复地从U中选取和P数量相同的样本作为负样本N,并打上标签,每次迭代都重复进行取样->建模->预测的过程,最后的预测概率使用T次迭代的平均值作为最终预测的概率。
参考文献:A bagging SVM to learn from positive and unlabeled examples ,PRL 2014
2.3 两步法
大部分的PU learning策略属于 “two-step approaches”。该方法的思想也很直观:
识别可以百分之百标记为negative的未标记样本子集(这些样本称为“reliable negatives”。)所谓的百分之百只是一个夸张的说法,通常我们可以用正样本和未标记样本训练一个模型,然后对未标记样本进行预测,按照概率排序,选取前面的样本作为reliable negatives。
使用正负样本来训练标准分类器并将其应用于剩余的未标记样本。
通常,会将第二步的结果返回到第一步并重复上述步骤。即每一轮循环都会找出那些所谓百分之百的正样本和负样本,加入到训练集里,重新预测剩余的未标记样本,直到满足停止条件为止。
参考文献:An Evaluation of Two-Step Techniques for Positive-Unlabeled Learning in Text Classification
三、代码实现
参考文献【1】【2】给出了以上3种方法的代码。参考文献【7】给出了第2种方法的代码。
我们以参考文献【1】【2】为例:作者在多种人工数据集和多个正样本比例上做了大量的实验,也对比了决策树和SVM作为基学习器的效果。实验完备详细,代码清晰易懂。
囿于篇幅,我们从中挑选出一个例子,进行介绍:
人工构造了Circles数据集,如下图所示:
上图一共有6000个样本点,真实得正样本和负样本均为3000个,只不过,我们只知道其中300个正样本,剩余的5700个样本认为是unlabeled样本。在该数据集上,分别应用以上3种方法,结果分别为:
我们对比一下3种方法的性能,这里的性能指的是:对于预测的样本(5700个),依次取前100,200,300直到2700个(剩余的真的正样本的个数)样本,看下取出的这些样本真正是正样本的概率。(看不明白的,可以详细看下代码)。
图中Average score是3种方法的平均。可以看出来,在有300个正样本的Circles数据集上,PU bagging的方法最好。
根据参考文献【1】的所有实验,我总结出以下的结果,详细请参考原文:
注:所有的数据集都是6000个样本,2类,每一类为3000个。我们已知的正样本的数目为hidden_size。
①对于Circles数据集:
hidden_size为1000时,Standard方法最好,PU bagging最差。
hidden_size为300时,PU bagging方法最好,Standard最差。
hidden_size为30时,PU bagging方法最好,Standard最差。
②对于Two moon数据集:
hidden_size为1000时,Standard方法最好,PU bagging最差。
hidden_size为300时,PU bagging方法最好,Standard最差。
hidden_size为30时,PU bagging方法最好,Standard最差。
③对于Blobs数据集:
hidden_size为1000时,Standard方法最好,PU bagging最差。
hidden_size为300时,PU bagging方法最好,Standard最差。
hidden_size为30时,PU bagging方法最好,Standard最差。
④对于PU bagging方法:
决策树作为基分类器的效果比起SVM作为基分类器的效果差。
通过上述的结果,和各个方法的理论,是否可以大胆做出一个结论呢?即随着已知正样本比例的减少,PU bagging最好,Standard最差,两步法居中。如果我们的正样本的比例只占全部样本的很小的部分,根据上述的结论,应该选用PU bagging策略。
参考文献
【1】Positive-unlabeled learning
【2】PU learning techniques applied to artificial data
【3】Masashi Sugiyama’s Publications
【4】PU Learning - Learning from Positive and Unlabeled Examples
【5】只有正样本和未标签数据的机器学习怎么做?
【6】Positive-unlabeled learning
【7】PU_Learning_simple_example.ipynb