【问题标题】:R: how to output prediction probabilities with classification modelsR:如何使用分类模型输出预测概率
【发布时间】:2020-06-09 21:31:02
【问题描述】:

当我用glm 拟合逻辑回归模型时,我可以指定type = "response" 来获得预测概率。

model <- glm(formula= vs ~ wt + disp, data=mtcars, family=binomial)
newdata = data.frame(wt = 2.1, disp = 180)
predict(model, newdata, type="response")
        1 
0.2361081 

我正在一个新包RSSL 中试验逻辑回归函数。下面是一些示例代码(来自文档)

library(RSSL)
set.seed(1)
df <- generateSlicedCookie(1000,expected=FALSE) %>% 
  add_missinglabels_mar(Class~.,0.98)
class_lr <- LogisticRegression(Class~.,df,lambda = 0.01)
df_test <- generateSlicedCookie(1000,expected=FALSE)
predict(class_lr,df_test)

class_lr 对象上使用predict 可以为我提供类标签。并且使用predict(class_lr,df_test, type = "response") 会导致错误。有没有办法让 R 输出预测的概率?

【问题讨论】:

    标签: r machine-learning logistic-regression prediction


    【解决方案1】:

    查看source code of LogisticRegression,对于predict,它以log-odds ratio计算预测并将其转换为概率并仅返回类,因此type="response"没有选项:

    setMethod("predict", signature(object="LogisticRegression"), function(object, newdata) {
    ModelVariables<-PreProcessingPredict(object@modelform,newdata,scaling=object@scaling,intercept=object@intercept)
      X<-ModelVariables$X
    
      w <- matrix(object@w, nrow=ncol(X))
      expscore <- exp(cbind(rep(0,nrow(X)), X %*% w))
      probabilities <- expscore/rowSums(expscore)
    
      # If we need to return classes
      classes <- factor(apply(probabilities,1,which.max),levels=1:length(object@classnames), labels=object@classnames)
      return(classes)
    })
    

    与该类关联的另一个方法是posterior,可以看到代码非常相似,都是以exp形式返回概率:

    setMethod("posterior", signature(object="LogisticRegression"), function(object,newdata) {
    
      ModelVariables<-PreProcessingPredict(modelform=object@modelform,
                                           newdata=newdata,
                                           y=NULL,
                                           scaling=object@scaling,
                                           intercept=object@intercept)
    
      X<-ModelVariables$X
    
      w <- matrix(object@w, nrow=ncol(X))
      expscore <- exp(cbind(rep(0,nrow(X)), X %*% w))
      posteriors <- expscore/rowSums(expscore)
    
      posteriors <- exp(posteriors)
      colnames(posteriors) <- object@classnames
      return(posteriors)
    })
    

    抱歉,回答有点长,如果您需要概率,您可以这样做:

    probs = log(posterior(class_lr,df_test))
    

    第一列是属于第一类的概率,第二列以此类推。检查标签是否相似:

    pred_labels = predict(class_lr,df_test)
    table(apply(probs,1,which.max) == as.numeric(pred_labels))
    TRUE 
    1000 
    

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 2021-06-27
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 2021-08-25
      相关资源
      最近更新 更多