有人可以告诉我用二进制目标模拟数据集的最佳方法是什么吗?
我了解可以模拟数据集的方式,但我正在寻找的是确定每个类别所占比例的“先验”。我当时想改变拦截器来实现它,但是我做不到,我也不知道为什么。我想是因为平均水平正在骗我。
set.seed(666)
x1 = rnorm(1000)
x2 = rnorm(1000)
p=0.25 # <<< I'm looking for a 25%/75%
mean_z=log(p/(1-p))
b0 = mean( mean_z - (4*x1 + 3*x2)) # = mean_z - mean( 2*x1 + 3*x2)
z = b0 + 4*x1 + 3*x2 # = mean_z - (4*x1 + 3*x2) + (4*x1 + 3*x2) = rep(mean_z,1000)
mean( b0 + 4*x1 + 3*x2 ) == mean_z # TRUE!!
pr = 1/(1+exp(-z))
y = rbinom(1000,1,pr)
mean(pr) # ~ 40% << not achieved
table(y)/1000
我要寻找的是模拟典型的“物流”问题,在该问题中,二进制目标可以建模为特征的线性组合。
这些“逻辑”模型假定二进制变量的对数比呈线性变化。这意味着:
log (p / (1-p)) = z = b0 + b1 * x1 + b2 * x2 where p = prob (y = 1)
回到我的示例代码,我们可以这样做,例如:z = 1.3 + 4 * x1 + 2 * x2,但是该类的概率是结果。或者相反,我们可以选择系数b0,以使概率(统计上)类似于所寻求的概率:
log (0.25 / 0.75) = b0 + 4 * x1 + 2 * x2
这是我的方法,但可能会更好
答案 0 :(得分:0)
我认为您正在考虑使用逻辑回归模型,对吗?如果是这样,则生成数据集的一种方法是创建两个高斯凹凸,并说一个是1类,另一个是0类。然后从1类生成25个项目,从0类生成75个项目。然后,每个生成的项目加上其标签是基准或记录或任何您想调用的名称。
很显然,您可以选择1和0的任意比例。通过使高斯凸点距离更远(即,与均值差相比,方差较小)使问题“容易”,或使凸点重叠(即,与均值的差相比,方差较大)而使问题“棘手”,这也很有趣。 / p>
编辑:为了使样本数据与逻辑回归模型完全对应,只需使两个高斯凸点的方差相同即可。当方差(这里我特别是指协方差矩阵)相同时,后验概率相等的曲面是平面;当协方差不同时,等概率面为二次方。这是标准结果,将出现在许多教科书中。我在网上也有一些关于此的注释,如果有帮助,我可以找到这些注释。
除了分别生成两个类然后将结果合并为一组外,您还可以从x
上的单个分布中抽样,将x
插入具有一定权重的Logistic回归模型中(您可以通过任意方式选择),然后将结果输出用作抛硬币的概率。不能保证此方法输出的比例与上一类的概率完全对应。