ADP (R)

[R] kernlab class probability calculations failed

멋쟁이천재사자 2022. 10. 23. 12:01

1. 발생

 

분류문제를 randomForest 와 svm 두 가지 방식으로 예측하여 비교해보는 중이었습니다.

ROC Auc 지표로 비교하기 위해 확률값으로 결과를 예측하는 과정에서 svm 모델에서 오류가 발생하였습니다.


library(caret)
library(recipes)
library(dplyr)

set.seed(2022)
train <- createDataPartition(y=iris$Species, p=0.7,list = F)
NROW(iris);NROW(train)
iris.train <- iris[train,]
iris.test <- iris[-train,]

iris.rf <- train(form=Species ~ ., 
                        data=iris.train, 
                        method="rf",  
                        trControl=trainControl(method="cv",number=10), 
                        tuneLength=10)  
iris.svmRadial <- train(form=Species ~ ., 
                           data=iris.train, 
                           method="svmRadial",  
                           trControl=trainControl(method="cv",number=10), 
                           tuneLength=10)  

pred.rf <- predict(iris.rf, iris.test)
pred.svmRadial <- predict(iris.svmRadial, iris.test)

pred.rf <- predict(iris.rf, iris.test,type="prob")
pred.svmRadial <- predict(iris.svmRadial, iris.test,type="prob")

Warning message:

In method$prob(modelFit = modelFit, newdata = newdata, submodels = param) :

  kernlab class probability calculations failed; returning NAs

 

 

 

2. 원인 및 해결 방법

확률값을 구하기 위해서는 train control 구문에 classProbs = TRUE를 지정해야합니다.

출처 : https://stackoverflow.com/questions/17846534/support-vector-machine-train-caret-error-kernlab-class-probability-calculations

 

 

3. 수정

classProbs = TRUE를 추가한 후에 잘 동작합니다.

그런데, "rf" 의 경우에는 classProbs =  TRUE 를 생략해도 type="prob" 의 결과를 동일하게 얻을 수 있습니다.


library(caret)
library(recipes)
library(dplyr)

set.seed(2022)
train <- createDataPartition(y=iris$Species, p=0.7,list = F)
NROW(iris);NROW(train)
iris.train <- iris[train,]
iris.test <- iris[-train,]

iris.rf <- train(form=Species ~ ., 
                        data=iris.train, 
                        method="rf",  
                        trControl=trainControl(method="cv",number=10), 
                        tuneLength=10)  
iris.svmRadial <- train(form=Species ~ ., 
                           data=iris.train, 
                           method="svmRadial",  
                           trControl=trainControl(method="cv",number=10), 
                           tuneLength=10)  

pred.rf <- predict(iris.rf, iris.test)
pred.svmRadial <- predict(iris.svmRadial, iris.test)

 

iris.rf <- train(form=Species ~ ., 
                  data=iris.train, 
                  method="rf",  
                  trControl=trainControl(method="cv",
                                         classProbs =  TRUE,
                                         number=10), 
                  tuneLength=10)  
iris.svmRadial <- train(form=Species ~ ., 
                   data=iris.train, 
                   method="svmRadial",  
                   trControl=trainControl(method="cv",
                                          classProbs =  TRUE,
                                          number=10), 
                   tuneLength=10)  

pred.rf <- predict(iris.rf, iris.test,type="prob")
pred.svmRadial <- predict(iris.svmRadial, iris.test,type="prob")