PUlearning简介(附python代码)
⼀、引⾔
在现实⽣活中,有许多只有正样本和⼤量未标记样本的例⼦。这是因为负类样本的⼀些特点使得获取负样本较为困难。⽐如:
负类数据不易获取。
负类数据太过多样化。
负类数据动态变化。
举⼀个形象点的例⼦:⽐如在推荐系统⾥,只有⽤户点击的正样本,却没有显性负样本,我们不能因为⽤户没有点击这个样本就认为它是负样本,因为有可能这个样本的位置很偏,导致⽤户没有点。
因此,有研究⼈员开始关注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 中有介绍。该论⽂的核⼼结果是,在某些基本假设下(虽然对于现实⽣活⽬的⽽⾔可能稍微不合理),合理利⽤正例和未贴标签数据进⾏训练得到的标准分类器应该能够给出与实际正确分数成正⽐的分数。
python新手代码例子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策略。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。