可以通过特定概率强制逻辑回归或其他分类器吗?
Possible to force logistic regression or other classifier through specific probability?
我有一个包含二进制变量[Yes/No] 和连续变量 (X) 的数据集。我正在尝试制作一个模型来分类 [Yes/No] X.
根据我的数据集,当 X = 0.5 时,48% 的观察结果是肯定的。但是,我知道当 X = 0.5 时,“是”的真实概率应该是 50%。当我使用逻辑回归创建模型时 X = 0.5 != P[Yes=0.5].
我该如何纠正这个问题?我想如果它没有通过正确的点,所有的概率都应该被稍微低估。
在我的样本中添加一堆观察值来调整比例是否正确?
不一定只是逻辑回归,LDA、QDA 等也很有趣。
我搜索了 Stack Overflow,但只找到了有关线性回归的主题。
我相信在 R 中(假设您使用的是基于 R 的 glm
),您只需要
glm(y~I(x-0.5)-1,data=your_data,family=binomial)
I(x-0.5)
将协变量重新集中在 0.5,-1
抑制截距(截距 = 0 在 x=0.5
-> 概率 = 0.5 在 x=0.5
)。
例如:
set.seed(101)
dd <- data.frame(x=runif(100,0.5,1),y=rbinom(100,size=1,prob=0.7))
m1 <- glm(y~I(x-0.5)-1,data=dd,family=binomial)
predict(m1,type="response",newdata=data.frame(x=0.5)) ## 0.5
OP 写道:
How can I correct this? I guess all probabilities should be slightly underestimated if it does not pass true the correct point.
这不是真的。完全有可能低估某些值(如截距)而高估其他值。
根据您的情况举例:
真实概率:
set.seed(444)
true_prob <- function(x) {
# logit probabilities
lp <- (x - 0.5)
# true probabilities
p <- 1 / (1 + exp(-lp))
p
}
true_prob(x = 0.5)
[1] 0.5
但是如果您模拟数据并拟合模型,则可能会低估截距而高估其他值:
n <- 100
# simulated predictor
x <- runif(n, 0, 1)
probs <- true_prob(x)
# simulated binary response
y <- as.numeric(runif(n) < probs)
现在拟合模型并比较真实概率与拟合概率:
> true_prob(0.5)
[1] 0.5
> predict(m, newdata = data.frame(x = 0.5), type = "response")
1
0.479328
> true_prob(2)
[1] 0.8175745
> predict(m, newdata = data.frame(x = 2), type = "response")
1
0.8665702
所以在这个例子中,模型低估了 x = 0.5,高估了 x = 2
我有一个包含二进制变量[Yes/No] 和连续变量 (X) 的数据集。我正在尝试制作一个模型来分类 [Yes/No] X.
根据我的数据集,当 X = 0.5 时,48% 的观察结果是肯定的。但是,我知道当 X = 0.5 时,“是”的真实概率应该是 50%。当我使用逻辑回归创建模型时 X = 0.5 != P[Yes=0.5].
我该如何纠正这个问题?我想如果它没有通过正确的点,所有的概率都应该被稍微低估。
在我的样本中添加一堆观察值来调整比例是否正确?
不一定只是逻辑回归,LDA、QDA 等也很有趣。
我搜索了 Stack Overflow,但只找到了有关线性回归的主题。
我相信在 R 中(假设您使用的是基于 R 的 glm
),您只需要
glm(y~I(x-0.5)-1,data=your_data,family=binomial)
I(x-0.5)
将协变量重新集中在 0.5,-1
抑制截距(截距 = 0 在 x=0.5
-> 概率 = 0.5 在 x=0.5
)。
例如:
set.seed(101)
dd <- data.frame(x=runif(100,0.5,1),y=rbinom(100,size=1,prob=0.7))
m1 <- glm(y~I(x-0.5)-1,data=dd,family=binomial)
predict(m1,type="response",newdata=data.frame(x=0.5)) ## 0.5
OP 写道:
How can I correct this? I guess all probabilities should be slightly underestimated if it does not pass true the correct point.
这不是真的。完全有可能低估某些值(如截距)而高估其他值。
根据您的情况举例:
真实概率:
set.seed(444)
true_prob <- function(x) {
# logit probabilities
lp <- (x - 0.5)
# true probabilities
p <- 1 / (1 + exp(-lp))
p
}
true_prob(x = 0.5)
[1] 0.5
但是如果您模拟数据并拟合模型,则可能会低估截距而高估其他值:
n <- 100
# simulated predictor
x <- runif(n, 0, 1)
probs <- true_prob(x)
# simulated binary response
y <- as.numeric(runif(n) < probs)
现在拟合模型并比较真实概率与拟合概率:
> true_prob(0.5)
[1] 0.5
> predict(m, newdata = data.frame(x = 0.5), type = "response")
1
0.479328
> true_prob(2)
[1] 0.8175745
> predict(m, newdata = data.frame(x = 2), type = "response")
1
0.8665702
所以在这个例子中,模型低估了 x = 0.5,高估了 x = 2