R: как вывести прогнозные вероятности с классификационными моделями - PullRequest
1 голос
/ 26 февраля 2020

Когда я подгоняю регрессионную модель логистики c к 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 

Я экспериментирую с регрессионной функцией логистики c в новой упаковке 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)

Использование predict на объекте class_lr дает мне метки классов. И использование predict(class_lr,df_test, type = "response") приводит к ошибке. Есть ли способ получить R для вывода прогнозируемых вероятностей?

1 Ответ

0 голосов
/ 26 февраля 2020

Глядя на исходный код LogisticRegression , для предиката он вычисляет прогноз в соотношении log-odds, преобразует его в вероятности и возвращает только класс, поэтому для 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...