逻辑回归与优化算法中的成本函数

机器算法验证 回归 物流 采样 优化 临界点
2022-04-08 01:30:26

我有一张像这样的桌子:

    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")

逻辑模型和阈值选择>.1

另一个模型是:

    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 包没有可能引入另一个成本函数?
  • 在实际示例中使用“优化”会是一个坏主意吗?过拟合怎么办?而且,我是否必须像在这个迷你示例中那样对所有变量进行编程?有没有更好的办法?
  • 如何进行过采样或下采样以避免这种情况?

我真的很感激理论上的答案。

1个回答

如果我理解你做了什么,那么你做的事情就乱了套。最大似然或惩罚最大似然估计是估计回归模型中的参数的黄金标准方法。成本函数不适用于估计风险的方式。成本函数应用于个人风险估计,为该观察提供最佳决策。