欠采样后概率还原问题

  统计/机器学习 监督式学习    浏览次数:8617        分享
5

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

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

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

 

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



   2个回答 
17

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

假设负样本非常多,正样本非常少。于是我们训练时保留了全部的正样本,但是对负样本进行了欠采样,比如说我们只用了$\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.

SofaSofa数据科学社区DS面试题库 DS面经

strong.man   2018-09-21 09:34

11

令$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

SofaSofa数据科学社区DS面试题库 DS面经

Zealing   2018-09-21 15:13



  相关讨论

MLR分片模型是什么模型?

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

有序多分类问题

为什么说knn是惰性算法

关于方差和偏差和噪声

为什么LR要用Sigmoid函数?

knn推导过程中的一个细节

stacking模型里每个子模型的权重如何确定?

rulefit和gdbt+lr有什么区别?

adaboost里的learning rate是什么意思?

  随便看看

python怎么对list中的元素做连乘?

随机森林会发生过拟合(overfitting)吗?

python里怎么计算曼哈顿距离?

推荐系统中的召回(recall)是什么意思?

plt.bar怎么设置每个bar的颜色?