r - 从随机猜测二元分类模型模拟

标签 r classification simulation

我需要模拟来自随机猜测二元分类器的数据

$p(成功)= 0.55$ 和 $p(失败)= 1-0.55$。

所以我如下模拟了伯努利分布的数据,并将结果与​​实际响应数据进行了比较。

set.seed(123)
#predicted response
y_pred=replicate(50,rbinom(1,1,prob = 0.55))

#actual response
y=sample(rep(0:1,each=25))

table(y,y_pred)
 

  y_pred
y    0  1
  0 13 12
  1 10 15

我做对了吗?任何指导都会非常有帮助。

最佳答案

对我来说看起来很合理。不过,您不需要 replicate。我个人会设置全局 n:

set.seed(123)
## predicted response
n <- 50
y_pred <- rbinom(n, 1, prob=.55)
## calculate actual probability of predicted response
sum(y_pred) / length(y_pred)
# [1] 0.54

## actual response
y <- sample(rep(0:1, each=n/2))
## calculate actual probability of actual response
sum(y) / length(y)
# [1] 0.5

table(y, y_pred)
#    y_pred
# y    0  1
#   0 13 12
#   1 10 15

但是,您在如此小的 n 下预测响应的实际概率可能会有很大的随机波动(即取决于种子),特别是对于小的 n。让我们将代码放入一个函数中一分钟来展示这一点。

n <- 50

sfun <- function() {
  y_pred <- rbinom(50, 1, prob=.55)
  sum(y_pred) / length(y_pred)
}

set.seed(383159)
sfun()
# [1] 0.62  ## 13% off!
set.seed(82809)
sfun()
# [1] 0.44  ## 20% off!

您可以做的是使用repeat 循环,如果结果在设定的tol 范围内则循环中断。 (注意,当 tol 设置得太小时,这将永远运行!)

tol <- .01
set.seed(123)
n <- 50
repeat({
  y_pred <- rbinom(n, 1, prob=.55)
  pr1 <- sum(y_pred) / length(y_pred)
  if (pr1 <= .55 + tol & pr1 >= .55 - tol)
    break
  })
y_pred
# [1] 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0
# [35] 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
sum(y_pred) / length(y_pred)
# [1] 0.54  ## ok!

关于r - 从随机猜测二元分类模型模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63680731/

相关文章:

r - 叠加不同物种积累图

将列表列表作为数据框返回

python - 二元分类中的特征重要性并仅提取其中一类的 SHAP 值

algorithm - 多类别分类 - 为每个类别使用一组不同的负样本是个好主意吗?

machine-learning - 分割训练和测试数据

r - 向 geom_bar()/geom_col() 条添加图案或纹理?

r - 从 Tibble Columns 创建一个列表

algorithm - CUDA 粒子中的最近邻

c# - 基于细胞的液体模拟 : Local pressure model?

physics - 实时流体模拟技术