我有一张像这样的桌子:
tabla <-data.frame(c=c(-3, -2, -1, -1, 1, 2, 3, 0, 0, 5, 4,
3, 0, 8, 9, 10, 6, 6, 7, 3, 0), e=c(0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1))
tabla <- tabla[order(tabla$c), ]
假设我需要使用逻辑回归预测 e 和 c:
log_pru <- glm(e ~ c, data = tabla, family = binomial(logit))
tabla$pred_res <- predict(log_pru, tabla, type = "response")
让我们假设当我的选择是 TP 时我的增益是 90,而当 FP 函数是 -10 时:
mycost <- function(r, pi){
weightTP = -90 #cost for getting 1 ok -90
weightFP = 10 #cost for getting 0 wrong 10
cTP = (r==1)&(pi==1) #logical vector--- true is actual==1
#and predict ==1
cFP = (r==0)&(pi==1) #logical vector - true if actual 0
#but predict 1
return(mean(weightTP*cTP+weightFP*cFP))
}
如果我能够在没有 FP 的情况下识别每个 TP,我的收益将是:
maxgain <- tabla$e*90
sum(maxgain)
630
在对数模型中,我的收获是:
tabla$ganLog <- ifelse(tabla$pred_res>.1, tabla$e*90-10, 0)
这是420。
我认为在优化算法中引入成本函数可能有助于反映我的实际问题。
因此,为了使用“优化”,我编写了以下函数(这是一个 sigmoidal):
fn <- function(x) {
alpha <- x[1]
beta <- x[2]
J <- exp(alpha + tabla$c * beta)
prediction <- ifelse(J/(1+J) > 0.5, 1, 0)
mycost(tabla$e, prediction)
}
guess <- optim(c(0,0), fn, method='SANN')
我的结果是:
alpha <- guess$par[1]
beta <- guess$par[2]
J<-exp(alpha + tabla$c * beta)
tabla$pred_guess = J/(1+ J)
plot(tabla$c, tabla$e)
lines(tabla$c, tabla$pred_guess)
mycost(tabla$e, ifelse(tabla$pred_res > 0.1, 1, 0))
tabla$ganOpt<-ifelse(tabla$pred_guess>.5, tabla$e*90-10,0)
sum(tabla$ganOpt)
这是 460。(几乎比使用 glm 的逻辑获得的值大 10%)。如果我绘制两个图:
plot(e ~ c, data=tabla)
lines(tabla$c, log_pru$fitted, type="l", col="red")
abline(0.1, 0)
abline(v=min(tabla$c[tabla$pred_res>0.1]), col="blue")

另一个模型是:
plot(tabla$c, tabla$e, main="optim")
lines(tabla$c, tabla$pred_guess, col="red")
abline(0.5, 0)
abline(v=min(tabla$c[tabla$pred_guess>0.5]), col="blue")

我知道您可以在其中引入成本函数,cv.glm但这只是在已经选择的模型中进行选择,所以,我的问题是:
- 在选择参数的算法中引入成本函数是个好主意吗?
- SAS 对 Miner 中的成本函数做了什么?它是否使用它来选择参数值?
- 为什么 R 中的 glm 包没有可能引入另一个成本函数?
- 在实际示例中使用“优化”会是一个坏主意吗?过拟合怎么办?而且,我是否必须像在这个迷你示例中那样对所有变量进行编程?有没有更好的办法?
- 如何进行过采样或下采样以避免这种情况?
我真的很感激理论上的答案。