欠采样后概率还原问题

  统计/机器学习 监督式学习    浏览次数: 763
3

我有个非平衡的二元分类问题,0和1的比例是1比7左右。因为数据量不少,所以我对1进行了欠采样,随机取了1/7的1。

欠采样之后,0和1的比例基本上就是1:1了。问题是,根据这个样本进行训练的模型,作用在测试集上,测试集的概率都偏大了,按道理概率的平均值是0.125,结果是0.5。这个应该是和欠采样有关的。

有什么办法对这个进行修正吗?

 

大王来巡山   2017-05-28 23:42



   2个回答 
8

这个问题一直没有人回答,我来说说吧。

假设负样本非常多,正样本非常少。于是我们训练时保留了全部的正样本,但是对负样本进行了欠采样,比如说我们只用了$\beta$比例的负样本,$0\lt \beta\lt 1$。假设$X$样本在欠采样之后,被预测为正样本的概率为$p_s$,那么修正后的概率为

$$p=\frac{p_s\beta}{p_s\beta-p_s+1}$$

比如说,原来正负比例为1:10,欠采样的$\beta$为0.2,也就是说20%的负样本被选中。欠采样之后,正负比例为1:2,样本$X$被预测为正的概率为$p_s=0.5$,那么

$$p=\frac{p_s\beta}{p_s\beta-p_s+1}=\frac{0.5\cdot 0.2}{0.5\cdot 0.2-0.5+1}\approx 0.183$$


参考文献:

Calibrating Probability with Undersampling for Unbalanced Classification. A.D. Pozzolo, et al.

strong.man   2018-09-21 09:34

4

令$X$为输入数据,$Y$为原始标签,$Y'$为数据平衡(subsample/oversample)后的标签,$P(X|Y)$为模型得到的释然函数,$P(Y)$为0/1类概率的先验知识。默认释然函数在数据平衡前后是一致的,$P(X|Y)=P(X|Y')$

根据贝叶斯, $P(Y|X)=\dfrac{P(X|Y)P(Y)}{P(X)} =P(X|Y)P(Y)\frac{1}{Z}$,这里$P(X)=Z$是一常数,一般忽略。

做完数据平衡后, $P(Y'=1)=P(Y'=0)=0.5$,模型输出(比如logistic regression)为标签1的概率$p_s$

$$p_s=P(Y'=1|X)=P(X|Y'=1)P(Y'=1)$$。

做完数据平衡前$P(Y=1)/P(Y=0)=\beta$,假设标签1的样本更少,$\beta \in [0,1)$。我们想要知道的原始数据得到的为标签0/1的概率$p_0,p_1$

$$p_1=P(Y=1|X)=P(X|Y=1)P(Y=1)=\dfrac{P(Y'=1|X)}{P(Y'=1)}P(Y=1)=2p_sP(Y=1)$$

$$p_0=P(Y=0|X)=P(X|Y=0)P(Y=0)=\dfrac{1-P(Y'=1|X)}{P(Y'=0)}P(Y=0)=2(1-p_s)P(Y=0)$$

对上面两式做归一化,得原始标签为1的概率

$$p=\dfrac{p_1}{p_1+p_0}$$

$$=\dfrac{2p_sP(Y=1)}{2p_sP(Y=1)+2(1-p_s)P(Y=0)}$$

$$=\dfrac{p_s\beta}{p_s\beta+1-p_s}$$

结论:关键的思想是释然函数只和模型相关,和数据无关。对数据subsample或oversample,只会影响先验概率$P(Y)$。以释然函数为桥,通过平衡后的后验概率$p_s$得到释然函数$P(Y=1|X)$,然后由释然函数再得平衡前的后验概率$p$。

这里对这种先数据平衡再对后验概率做修正的方法提出疑问。结论是用SVM更好。

这个总结提到,如果用logistic regression。有两种方法。

1.Bias Correction method

2.Penalized Maximum Likelihood Estimation, Firth method

Zealing   2018-09-21 15:13



  相关主题

knn推导过程中的一个细节   2回答

SVM的支持向量最少有几个?   1回答

有序多分类问题   2回答

支持向量机(SVM)里的支持向量是什么意思   6回答

关于方差和偏差和噪声   1回答

k-NN的k取1会怎么样   4回答

kNN的k=1为什么训练误差为0?   4回答

SVM里的软间隔是什么意思   2回答

adaboost里的learning rate是什么意思?   1回答

线性可分是什么意思?   1回答

为什么说knn是惰性算法   1回答

python里如何实现线性判别分析(LDA)?   1回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!