Learning Classifiers from Only Positive and Unlabeled Data

本文主要考虑在SCAR假设下,证明了普通的分类器和PU分类器只相差一个常数,因此可以使用普通分类器的方法来估计$p(s|x)$,进而得到$p(y|x)$。同时提供了三种方法来估计这个常数,最后,还对先验$p(y)$的估计提供了思路。

#Learning a traditional classifier

  1. 概念定义

    • $x$ 表示一个样本,$y$ 表示其label(0或者1),$s$表示是否被select
    • 那么,在PU问题中,当$s =1 $时,一定有$y = 1$
    • $P(s = 1| x,y=0) = 0 $ 一定成立
  2. 两种采样假设

    • signle-training-set
      • 所有的样本都是从$(x,y,s)$这个三元组的分布中采样的
    • case-control
      • 两个数据集(正类,未标记)是从三元组中独立的抽样出来的。当采样正类时被称为case,采样未标记数据时称为contaminated controls
    • 这两种假设有很明显的区别。总的来说,第一种假设比第二种假设要严格得多,也就能提供更多的信息:
      • 两种假设都能让我们估计$p(x)$
      • 但只有在第一种假设下,能够让我们很容易的估计出$p(s = 1)$,因此也更容易估计出$p(y = 1)$,二第二种条件不可以。
  3. 基本假设

    • 我们需要训练的传统分类器是:$f(x) = p(y = 1|x)$
    • 然而,对正类数据没有任何假设的前提下,我们很难得到较好的分类器
    • 因此,论文给出的假设是,正类样本数据是从正类数据中完全随机的抽取出来的。
      • 也就是说,当$y = 1$时,无论$x$取说明值,它们的概率都是相同的:
        • $p(s = 1| x,y=1) = p(s =1|y=1)$
      • 这个假设被称为selected completedly at random
    • 我们定义一个nontraditional classifier:$g(x) = p(s =1|x)$
    • 因此,我们需要一些定理来证明如何将非传统的分类器转化为传统的分类器
  4. Lemma:假设SCAR条件成立,那么$p(y = 1|x) = \frac{p(s=1|x)}{c}$,其中$c = p(s=1|y=1)$

    • 证明:由于我们的假设是:$p(s = 1| x,y=1) = p(s =1|y=1)$,因此:

    • $$\begin{aligned}p(s=1 | x) &=p(y=1 \wedge s=1 | x) \
      &=p(y=1 | x) p(s=1 | y=1, x) \
      &=p(y=1 | x) p(s=1 | y=1) \end{aligned}$$

  • 将我们的分类器带入为:$f(x) = \frac{g(x)}{p(s=1|y=1)}$

  • 这里可以得到几个结论:

    1. $f$是$g$的单调递增函数,因此,如果我们只需要对$x$进行rank排序,那么直接可以用$g$代替$f$
    2. $g \le p(s=1|y=1)$恒成立。这也是很显然的,同时,我们可以定义$c = p(s=1|y=1)$为一个常数。
  1. 如何来估计$c$呢?一般采用交叉验证,设交叉验证集合为$P$

    1. 第一种方式是直接在正类数据集中进行抽样

      • 令$P$是未标记数据集$V$的一个子集,且全是正类,因此,我们可以估计$c = p(s=1|y=1)$为$e_1$
      • $e_1 = \frac{1}{n}\sum_{x\in P} g(x) = \frac{1}{n}\sum_{x\in P} p(s=1|y=1)$
      • 也就是用均值来估计概率(证明很容易,见论文)
    2. 第二种方式是在两个样本集中分别进行抽样

      • $e_2 =\sum_{x\in P} g(x) /\sum_{x\in V} g(x)$

      • 这个估计其实和$e_1$基本相同,这是因为:$E(\sum_{x\in V}g(x)) = p(s=1)m = E[n|m]$

      • 其中$m$是$V$的数量,$n$是$P$的数量

    3. 第三种方式是根据$g \le p(s=1|y=1)$的结论,估计$e_3 = \max_{x\in V}g(x)$

  2. 那么,这三种估计方式哪一个更好呢?

    • 显然,如果我们的分类器能做到$g(x) = p(s =1|x)$,那么第一种估计一定是正确的,但现实中分类器是从一个有限的训练集中进行学习的,同时,模型的选择也是近似;
    • 但比较其他两种方式,第一种估计的方式的方差更小

#Weighting unlabeled

论文中对于$h(x,y)$函数进行估计,得到结论:对于在正类中每个样本的权重是1,而在未标记中,正类的权重是$w$,负类的权重是$1-w$

  1. 我们已经可以估计$c$了,那么希望将尽可能多的概率转为我们已知的估计:
    • $p(y=1|x,s=0) = \frac{1-c}{c} \frac{p(s=1|x)}{1-p(s=1|x)}$
    • 很显然,$p(y=1|x,s=1)=1$恒成立
  2. 因此,对于任意函数$E[h]$的估计为:
    • $\frac{1}{m} (\sum\limits_{x,s=1}h(x,1) + \sum\limits_{x,s=0}w(x)h(x,1) + (1-w(x))h(x,0))$
    • 其中权重$w = p(y=1|x,s=0)$
    • 观察该式我们可以发现,在$h$的估计中,在正类中的每个样本权重为1,而在未标记中,正类的权重是$w$,负类的权重是$1-w$
  3. 因此,我们可以改写$h$使得变为一个learning algorithm,有两种思路,一种是直接对$h$进行估计,然后再用以上的式子取平均;第二种方式是在估计时就根据以上的式子对不同的样本取不同的权重
  4. 考虑一种特殊的情况:$h(x,y) = y$,也就是对$p(y)$ 进行估计,那么很显然:
    • $E[y] = p(y =1) = \frac{1}{m}(n + \sum\limits_{x,s=0} w(x))$
  5. 另外一种估计$p(y) =1$的方法是直接用我们之前的公式:
    • $c = \frac{p(s=1 \wedge y=1)}{p(y=1)}, \hat{c} = \frac{1}{n}\sum_{x\in P} g(x), p(s=1 \wedge y=1) = \frac{n}{m}$
    • 因此可以得到估计值为:$\frac{n^2}{m \sum_{x\in P}g(x)}$

#Experiment

作者自己收集了SwissProt数据集,符合case-control的假设

  • U:是未标记数据集
    • Q:未标记数据集中的正类
    • N:未标记数据集中的负类
  • P:是正类数据集

论文中做了如下的对比实验:

  1. 标准的分类问题(P+Q vs N),分类阈值为0.5
    • 使用libSVM进行训练
  2. 在PU问题中先学习分类器,然后再重新调整权重(P vs U),分类阈值为0.5c
    • 使用Platt scaling得到概率输出$p(s=1|x)$,根据分类阈值进行分类(需要对c进行估计)
  3. 先对未标记数据调整权重,再学习分类器(P vs U),分类阈值为0.5
    • 首先用Platt scaling得到概率估计,并转为权重:
      • $w = p(y=1|x,s=0) = \frac{1-c}{c} \frac{p(s=1|x)}{1-p(s=1|x)}$
    • 再对每个样本赋予不同的权重(需要对c进行估计),重新使用libSVM进行训练
  4. 使用biased SVM进行学习,分类阈值为0
    • 对不同的样本设置不同的权重,重复训练多次,每次用70%作为训练,20%作为验证,得到最好的参数后再对90%的所有训练数据进行训练(10%是test data)

主要有两种方法处理PU问题

  1. 首先用某些启发式方法看未标记中的数据哪些是负类,然后再用常见的分类方法进行学习
  2. 对未标记数据的每个样本设置不同的权重(表示是负类的可能性大小),然后将未标记数据看作是加权的负样本数据,再进行训练
  3. 第三种方法与论文中的方法类似
    • 首先将未标记数据看成是正类样本和负类样本的加权
    • 提供一种计算权重的方式,同时,对于不同的样本,权重也不一样

其中第一种方法可以看成是第二种方法的特例,因为权重可以取1或者0

#Biased SVM

优化目标函数:

$$\min \frac{1}{2} ||w||^2 + C_P\sum_{i\in P} z_i + C_U\sum_{i\in U} z_i$$

$$s.t. \quad y_i(wx+b) \ge 1-z_i$$

同时,$C_P$一般来说惩罚要比$C_U$大

#Summary

这篇文章最重要的地方是证明了$p(y = 1|x) = \frac{p(s=1|x)}{c}$。在PU问题中,我们很容易使用常见的分类器得到输出概率$p(s|x)$,这样通过估计常数c(直接取概率的均值),我们就能得到普通的二分类器。

另外一种方法是,得到输出概率$p(s|x)$后,再根据公式$w = p(y=1|x,s=0) = \frac{1-c}{c} \frac{p(s=1|x)}{1-p(s=1|x)}$转换为权重,对每个样本分配不同的权重再进行训练。

#Reference

  1. Learning Classifiers from Only Positive and Unlabeled Data
  2. SwissProt records dataset
  3. Platt scaling
Load Comments?