PU learning简介(附python代码)

本文探讨了在仅有正样本和未标记样本的情况下,如何进行二元分类的问题,介绍了三种实用的PULearning技巧:直接利用标准分类方法、PUbagging及两步法。并通过实验对比了这些方法在不同数据集和正样本比例下的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言
在现实生活中,有许多只有正样本和大量未标记样本的例子。这是因为负类样本的一些特点使得获取负样本较为困难。比如:

负类数据不易获取。
负类数据太过多样化。
负类数据动态变化。
举一个形象点的例子:比如在推荐系统里,只有用户点击的正样本,却没有显性负样本,我们不能因为用户没有点击这个样本就认为它是负样本,因为有可能这个样本的位置很偏,导致用户没有点。

因此,有研究人员开始关注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
--------------------- 
作者:anshuai_aw1 
来源:优快云 
原文:https://blog.youkuaiyun.com/anshuai_aw1/article/details/89475986 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 使用Python扩充数据集的方法及工具 在机器学习和深度学习项目中,数据增强是一种有效的方式,用于扩展有限的数据集并改善模型性能。以下是几种常用方法及其对应的Python工具。 #### 方法一:基于图像处理的增强方式 对于图像数据,可以通过旋转、翻转、缩放等方式来生成新样本。这些操作通常由专门的库支持完成。例如,在PyTorch框架下,`torchvision.transforms`模块提供了丰富的功能来进行数据增强[^1]: ```python import torch from torchvision import transforms transform = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转 transforms.RandomRotation(degrees=(0, 360)), # 随机旋转角度 transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), # 调整颜色参数 transforms.Resize((224, 224)), # 改变图片尺寸 transforms.ToTensor() # 将图片转换为张量 ]) ``` 上述代码展示了如何定义一组组合变换,并将其应用于输入图像数据上。 --- #### 方法二:利用高级API简化流程 除了手动编写复杂的预处理逻辑外,还可以借助更高级别的封装工具如 `imgaug`, `albumentations` 或者 TensorFlow 的 Keras API 来快速实现复杂的数据增强策略。下面是一个使用 `imgaug` 库的例子: ```python import imgaug.augmenters as iaa seq = iaa.Sequential([ iaa.Fliplr(0.5), # 水平翻转的概率设为50% iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, rotate=(-45, 45)), iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255)) ]) images_augmented = seq(images=[image]) # 对单幅或多幅图像应用增强序列 ``` 此段脚本实现了多种几何与像素级变化相结合的效果[^3]。 --- #### 方法三:针对特定场景定制方案 当标准方法无法满足需求时,则需探索更加精细控制手段。比如音频信号可能涉及时间拉伸/压缩、音高偏移;自然语言则可通过同义词替换、句子重组等形式创造额外语料。而对于标注质量较差的情况,应特别注意避免因不当增广而引入过多干扰因素影响最终效果[^2]。 如果发现某些增强后的样例反而降低了整体表现力,那么可以尝试采用半监督学习(Pu-learning)理念筛选出真正有益部分作为补充材料参与后续训练过程。 --- ### 总结 综上所述,无论是基础还是进阶层面的操作都可以依靠现有的成熟软件包轻松达成目标——既简单又高效地扩增原始资料集合大小的同时还能兼顾到维持原有分布特性不变这一重要原则之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值