只有正样本和无标记数据的半监督学习(PU Learning)

作者:Alon Agmon
【只有正样本和无标记数据的半监督学习(PU Learning)】编译:ronghuaiyang
正文共:5411 字 6 图
预计阅读时间:16 分钟
导读在实际业务场景中 , 可能只会收到正反馈 , 所以反映到数据上 , 就只有正样本 , 另外就是大量的没有标记的样本 , 那么如何给这些没有标记的样本打上标签呢?
只有正样本和无标记数据的半监督学习(PU Learning)文章插图
当你只有几个正样本的时候 , 如何分类未标注的数据假设您有一个支付事务数据集 。 其中一些交易被标记为欺诈 , 其余的被标记为真实交易 , 你需要设计一个模型来区分欺诈交易和真实交易 。 假设你有足够的数据和良好的特征 , 这似乎是一个简单的分类任务 。 但是 , 假设只有15%的数据有标注 , 并且标注的样本只属于一个类 , 因此你的训练集由15%标记为真实的样本组成 , 而其余的没有标记 , 可能是真实的 , 也可能是虚假的 。 你如何对它们进行分类?这样的需求是否只是将这个任务变成了一个无监督的学习问题?好吧 , 不一定 。
这个问题 —— 通常被称为PU(正样本的和未标记的样本)的分类问题 —— 应该首先从两个相似且常见的“标注问题”中区分出来 , 这两个问题使许多分类任务复杂化 。 第一个也是最常见的标签问题是“小训练集”的问题 。 当你有相当数量的数据 , 但只有一小部分被标记时 , 它就会出现 。 这个问题有许多种类和相当多的具体训练方法 。 另一个常见的标记问题(通常与PU问题合并在一起)涉及的情况是 , 我们的训练数据集全都有标记 , 但它只包含一个类 。 例如 , 假设我们只有一个非欺诈事务的数据集 , 并且我们需要使用这个数据集来训练一个模型来区分(类似的)非欺诈事务和欺诈事务 。 这也是一个常见的问题 , 通常被视为无监督的离群点检测问题 , 尽管在ML领域中也有相当多的工具是专门设计来处理这些场景的(OneClassSVM可能是最著名的) 。
相比之下 , PU分类问题涉及到一个训练集 , 其中只有部分数据被标记为正 , 而其余数据未被标记 , 可能是正的 , 也可能是负的 。 例如 , 假设你的雇主是一家银行 , 它可以为你提供大量的事务性数据 , 但只能确认其中的一部分是100%真实的 。 我在这里使用的例子涉及到关于伪钞的类似场景 。 它包括了1200张纸币的数据集 , 其中大部分没有标记 , 只有一部分被确认为真实的 。 虽然PU问题也很常见 , 但是与前面提到的两个分类问题相比 , 它们的讨论要少得多 , 而且很少有实践的例子或库可以广泛使用 。
本文的目的是提供一种可能的方法来解决PU问题 , 我最近在一个分类项目中使用了这种方法 。 它是基于Charles Elkan和Keith Noto写的论文“Learning classifiers from only positive and unlabeled data”(2008) , 以及由Alexandre Drouin写的一些代码 。 尽管在文章中有更多的PU学习方法(我打算在以后的文章中讨论另一种相当流行的方法) , Elkan和Noto的(E&N)方法非常简单 , 可以很容易地在Python中实现 。
一点点理论(请原谅)
只有正样本和无标记数据的半监督学习(PU Learning)文章插图
E&N本质上声称 , 给定一个数据集 , 我们有正的和未标记的数据 , 某个样本标记为正的概率是 [ P(y=1|x)] 的概率等于样本被标记的概率 [P(s=1|x)] 除以我们的数据集中正样本被标记的概率[P(s=1|y=1)] 。
如果这个断言是正确的 , 那么实现起来就相对容易了 。 这是因为虽然我们没有足够的数据来训练分类器来告诉我们样本是正的还是负的 , 在PU场景中我们确实有足够的标签数据告诉我们正样本是否可能被标记 , 根据E&N , 这足以估计有多可能是正的 。
更正式地说 , 给定一个未标记的数据集 , 其中只有一组标记为正的样本 , 如果我们估计P(s=1|x) / P(s=1|y=1) , 我们就可以估计未标记的样本x为正的概率 。 幸运的是 , 我们几乎可以使用任何基于sklearn的分类器 , 按照以下步骤来估计:
只有正样本和无标记数据的半监督学习(PU Learning)文章插图
(1)在包含已标记和未标记数据的数据集上拟合一个分类器 , 同时使用isLabeled作为目标y 。 以这种方式拟合分类器 , 训练它预测给定样本x被标记的概率P(s=1|x) 。
(2)使用分类器预测数据集中已知正样本被标记的概率 , 预测结果可以表示为正样本被标记的概率 P(s=1|y=1|x) , 计算这些预测概率的平均值 , 这就是我们的P(s=1|y=1) 。 有了P(s=1|y=1)的估计值 , 为了预测数据点k为正的概率 , 根据E&N , 我们需要做的就是估计P(s=1|k)或它被标记的概率 , 这正是我们训练的分类器(1)知道如何做的 。