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}
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
通过以上结果分别计算TPR,FPR,PREC
\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}
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
得出如下结论: 即结论1不成立,和起初设想的不一样,怎么办呢,还是拿实际数据来说话吧。
matlab模拟
假设一个生成模型,p(s|y=1)服从N(1,1),p(s|y=0)服从N(-1,1),score即为s,即我们的预测值,通过改变正负样本比例,画出在2种比例下的ROC曲线,看有没有区别。
代码如下:
N=;
M=floor(N*);%不平衡样本
score=[normrnd(,,,N) normrnd(-,,,M)];
y=[ones(,N) zeros(,M)];
[TPR,FPR,TH] = roc(y,score);
plot(FPR,TPR,'r')
hold on
M=floor(N*);%平衡样本
score=[normrnd(,,,N) normrnd(-,,,M)];
y=[ones(,N) zeros(,M)];
[TPR,FPR,TH] = roc(y,score);
plot(FPR,TPR,'b')
%结果一样
aaarticlea/png;base64,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" alt="" width="442" height="274" />
图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) 分析问题要全面深入,这样可以对旧问题的分析,得到新的知识。也即温故而知新吧。