簡體   English   中英

R:如何使用分類模型輸出預測概率

[英]R: how to output prediction probabilities with classification models

當我使用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 輸出預測的概率?

查看LogisticRegression源代碼,對於 predict,它計算對數優勢比的預測並將其轉換為概率並僅返回類,因此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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM