首页 > 技术文章 > 【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考

littlelittleSmile 2014-07-12 16:01 原文

 

 

 

ROC曲线

在网上有很多地方都有说ROC曲线对于正负样本比例不敏感,即正负样本比例的变化不会改变ROC曲线。但是对于PR曲线就不一样了。PR曲线会随着正负样本比例的变化而变化。但是没有一个有十分具体和严谨地对此做出过分析和论证(至少我没有找到)。

此处记为结论1:

结论1:PR曲线会随着正负样本比例的变化而变化;但是ROC曲线不会。

此处我就这一问题进行了详细的分析论证,并在这个过程中引发了很多思考。

首先,如何分析这个问题呢?

看下ROC曲线是由TPR和FPR组成的

下面我们这样来分析这个问题,首先构造出一个数据集,并且其中某个参数可以控制数据集中正负正负样本比例。在不同样本分布的情况下,我们计算TPR,FPR,PREC,RECALL,如果TPR与FPR的关系与正负样本比例无关,而PREC与RECALL的关系与正负样本比例有关,则可以论证结论1

下面我们做出如下假设,并生成数据集来验证结论1

假设1:

数据集的score和Y是这样生成的,即score决定了Y的概率,P(Y=1|score)=score

数据集均匀地在0~m之间生成,即s服从在0~m之间的均匀分布。通过m的改变,可以改变正负样本的比例,从而严重不同比例下的TPR,FPR,PREC,RECALL变化情况...

 

 

\begin{equation} \left\{\begin{matrix}
TP=N\int_{c}^{m}sds=\frac{N}{2}(m^{2}-c^{2})
\\ FP=N\int_{c}^{m}(1-s)ds=N(m-c)-\frac{N}{2}(m^{2}-c^{2})
\\ TN=N\int_{0}^{c}(1-s)ds=N(c-\frac{1}{2}c^{2})
\\ FN=N\int_{0}^{c}sds=\frac{N}{2}c^{2}
\end{matrix}\right. \end{equation}

 

通过以上结果分别计算TPRFPRPREC

\begin{equation} \left\{\begin{matrix}
TPR=\frac{TP}{TP+FN}=1-\frac{c-\frac{1}{2}c^{2}}{m-\frac{1}{2}m^{2}}
\\ FPR=\frac{FP}{FP+TN}=1-(\frac{c}{m})^{2}
\\ PREC=\frac{TP}{TP+FP}=\frac{1}{2}(m+c)
\end{matrix}\right. \end{equation}

 

得出如下结论:  即结论1不成立,和起初设想的不一样,怎么办呢,还是拿实际数据来说话吧。

matlab模拟

假设一个生成模型,p(s|y=1)服从N(1,1),p(s|y=0)服从N(-1,1),score即为s,即我们的预测值,通过改变正负样本比例,画出在2种比例下的ROC曲线,看有没有区别。

代码如下:

 1 N=200000;
 2 M=floor(N*3);%不平衡样本
 3 score=[normrnd(1,1,1,N) normrnd(-1,1,1,M)];
 4 y=[ones(1,N) zeros(1,M)];
 5 [TPR,FPR,TH] = roc(y,score);
 6 plot(FPR,TPR,'r')
 7 hold on
 8 M=floor(N*1);%平衡样本
 9 score=[normrnd(1,1,1,N) normrnd(-1,1,1,M)];
10 y=[ones(1,N) zeros(1,M)];
11 [TPR,FPR,TH] = roc(y,score);
12 plot(FPR,TPR,'b')
13 %结果一样

图1  ROC不随着样本比例变化而变化

发现之前的分析是错误的,但是为什么呢?咋看下来,假设完全合理的呀,

下面我们构造一个生成模型,从这里生成的数据出发,重新分析一下:

假设2:

先验分布如下:P(Y=1)=z,P(Y=0)=1-z,这里的z可以控制样本的正负比例

在Y=1,0时会有不同的概率分布来产生一个观测量,即我们的score,它们的pdf分别是p(s|Y=1),p(s|Y=0)

我们根据这个先验和后验分布来生成我们的数据,样本个数为N,然后通过取不同的cutoff(记为c),得到不同cutoff下的TP,FP,TN,FN...

依据这个假设,我们可以得到

\begin{equation}\left\{\begin{matrix}
TP=N\int_{c}^{\infty}p(Y=1|s)p(s)ds=N\int_{c}^{\infty}p(Y=1,s)ds=N\int_{c}^{\infty}p(s|Y=1)P(Y=1)ds=N*P(Y=1)\int_{c}^{\infty}p(s|Y=1)ds
\\ FP=N\int_{c}^{\infty}p(Y=0|s)p(s)ds=N\int_{c}^{\infty}p(Y=0,s)ds=N\int_{c}^{\infty}p(s|Y=0)P(Y=0)ds=N*P(Y=0)\int_{c}^{\infty}p(s|Y=0)ds
\\ TN=N\int_{-\infty }^{c}p(Y=0|s)p(s)ds=N\int_{-\infty }^{c}p(Y=0,s)ds=N\int_{-\infty }^{c}p(s|Y=0)P(Y=0)ds=N*P(Y=0)\int_{-\infty }^{c}p(s|Y=0)ds
\\ FN=N\int_{-\infty }^{c}p(Y=1|s)p(s)ds=N\int_{-\infty }^{c}p(Y=1,s)ds=N\int_{-\infty }^{c}p(s|Y=1)P(Y=1)ds=N*P(Y=1)\int_{-\infty }^{c}p(s|Y=1)ds
\end{matrix}\right. \end{equation}

所以可以得到TPR,FPR和PREC,RECALL

\begin{equation} FPR=\frac{FP}{FP+TN}=\frac{P(Y=0)\int_{c}^{\infty}p(s|Y=0)ds}{P(Y=0)}=\int_{c}^{\infty}p(s|Y=0)ds \end{equation}

\begin{equation} TPR=\frac{TP}{TP+FN}=\frac{P(Y=1)\int_{c}^{\infty}p(s|Y=1)ds}{P(Y=1)}=\int_{c}^{\infty}p(s|Y=1)ds \end{equation}

\begin{equation} PREC=\frac{TP}{TP+FP}=\frac{P(Y=1)\int_{c}^{\infty}p(s|Y=1)ds}{P(Y=1)\int_{c}^{\infty}p(s|Y=1)ds+P(Y=0)\int_{c}^{\infty}p(s|Y=0)ds} \end{equation}

显然可以得到我们所希望得到的结论:即TPR,FPR与正负样本比例无关,但是PREC与正负样本比例有关。从而论证了结论1。

但是为什么假设1就得出了不同的结论了呢?

再回头看一下假设1,它是通过改变先验分布来决定正负样本比例的,这样是很自然的。并且后验分布并不会随着样本比例变化而变化。

但是假设1呢?其后验分布其实是随着样本比例变化而变化的,所以假设1的问题就出在这里了。即后验分布的变化导致了各个指标的变化,甚至导致AUC的变化。

如果只改变先验,而不改变后验的话,P(Y=1|score)就会发生变化。

即得出了如下结论:

结论2:在构造数据的过程中,要通过改变先验来改变正负比例的变化,不应该动后验。然后预测的概率在样本分布变化的情况下,需要进一步做修正(即Calibration)。

对于假设1,通过重采样正样本来改变正负样本比例,则预测的概率需要修正,再修正过后,可以得到与假设2同样的结论,论证结论1的成立。

对于结论2,我们可以得到新的信息,通常对于样本不平衡问题,都会采用重采样的方法,从一定程度上缓解不平衡性。注意重采样方法保证了少样本类别的样本分布依旧是同分布的。如果某种,就需要仔细推敲一下了。还有如果你是预测概率,通常要做calibration,修正概率值,那你的修正数据集一定要与先验一致(不要采用与重采样比例一致的样本),要不然修正的概率值是有偏的,从而你的修正是白费功夫或者是有害的。

总结:

  1) 分析问题需要仔细推敲,前提假设非常重要,真是一步错步步错。

  2) 分析问题要全面深入,这样可以对旧问题的分析,得到新的知识。也即温故而知新吧。

 

 

 

 

 

 

 

 

推荐阅读