Calculate confusion matrix on a prediction with SVM in R

Viewed 45

I would like to calculate the confusion matrix after making an SVM prediction on the diabetes class of the pima dataset

data("PimaIndiansDiabetes2", package = "mlbench")
pima.data <- na.omit(PimaIndiansDiabetes2) # remove rows with missing data
head(pima.data)
   pregnant glucose pressure triceps insulin mass pedigree age diabetes
4         1      89       66      23      94 28.1    0.167  21      neg
5         0     137       40      35     168 43.1    2.288  33      pos
7         3      78       50      32      88 31.0    0.248  26      pos
9         2     197       70      45     543 30.5    0.158  53      pos
14        1     189       60      23     846 30.1    0.398  59      pos
15        5     166       72      19     175 25.8    0.587  51      pos
set.seed(123)
idx = sample(nrow(pima.data), floor(0.7*nrow(pima.data)))
trn = pima.data[idx,]
tst = pima.data[-idx,]

library(e1071)


svm.fit <- svm(diabetes ~ ., data = trn, kernel="polynomial",cost=1,degree=2)

set.seed(22)

tune_out = tune(svm, 
                 diabetes ~ ., 
                 data = trn, 
                 kernel = "polynomial", 
                 ranges = list(cost = c(0.001,0.01, 0.1,1,10,100), 
                               degree = c(1,2,3,4)))




svm.pred <- predict(tune_out$best.model, newdata = tst)
length(svm.pred) #[1] 118
length(tst$diabetes) #[1] 118

But now svm.pred is in this form

> svm.pred
  4   7  15  19  26  32  36  40  41  51  60  69  88  89 106 109 110 121 126 128 131 136 140 145 148 157 162 170 182 198 199 200 205 207 
neg neg pos neg neg pos neg pos pos neg neg neg neg neg neg neg neg pos neg neg pos neg neg neg neg neg neg neg neg neg neg neg neg pos 
215 224 233 245 248 253 255 259 261 278 280 289 290 291 296 299 303 306 324 332 336 339 341 361 365 366 375 376 378 380 393 396 406 410 
neg pos neg pos pos neg neg pos pos neg neg neg neg neg pos neg neg neg neg neg pos pos neg pos neg neg neg pos neg neg neg pos neg pos 
412 420 423 432 443 447 448 451 461 479 483 484 487 504 509 520 527 528 540 544 547 552 566 567 570 573 574 576 589 607 611 615 626 638 
neg neg neg neg neg neg neg neg neg neg neg neg pos neg neg neg neg neg neg neg pos neg neg neg neg neg neg neg pos pos neg pos neg neg 
647 652 663 683 689 701 705 710 711 714 716 733 737 739 748 754 
neg neg pos neg neg neg neg neg neg neg pos pos neg neg neg pos 
Levels: neg pos

While tst$diabetes is in this one

> tst$diabetes
  [1] neg pos pos neg pos pos neg pos neg neg neg neg neg pos neg neg pos pos pos neg pos neg neg neg neg neg neg neg neg pos pos pos
 [33] neg pos pos neg neg neg neg neg pos neg neg neg neg neg neg neg neg pos neg neg pos neg neg pos neg pos neg neg neg pos neg neg
 [65] neg neg neg pos neg pos neg neg neg neg neg neg neg neg neg neg neg neg neg neg neg neg pos neg pos neg neg neg pos neg neg neg
 [97] pos pos neg pos neg neg pos neg pos neg neg neg neg pos neg neg pos pos neg neg neg pos
Levels: neg pos

and when I try to call the confusion matrix like this:

library(caret)
confusionMatrix(data = svm.pred, reference = tst$diabetes, positive = "yes")

I get this Error

Error in `[.default`(data, , positive) : subscript out of bounds

I tried to trasform svm.pred in the same form as tst$diabetes like this

> as.factor(matrix(svm.pred)[,1])
  [1] neg neg pos neg neg pos neg pos pos neg neg neg neg neg neg neg neg pos neg neg pos neg neg neg neg neg neg neg neg neg neg neg
 [33] neg pos neg pos neg pos pos neg neg pos pos neg neg neg neg neg pos neg neg neg neg neg pos pos neg pos neg neg neg pos neg neg
 [65] neg pos neg pos neg neg neg neg neg neg neg neg neg neg neg neg pos neg neg neg neg neg neg neg pos neg neg neg neg neg neg neg
 [97] pos pos neg pos neg neg neg neg pos neg neg neg neg neg neg neg pos pos neg neg neg pos
Levels: neg pos

> length(as.factor(matrix(svm.pred)[,1]))
[1] 118

But when I tried to call the confusion matrix angain a have the same error

> confusionMatrix(data = as.factor(matrix(svm.pred)[,1]), reference = tst$diabetes, positive = "yes")
Error in `[.default`(data, , positive) : subscript out of bounds

I'm doing everything wrong and I have to change my approach or I'm making a mistake somewhere?


Ok maybe I found a solution


x=table(tst$diabetes, as.factor(matrix(svm.pred)[,1]))

> x
     
      neg pos
  neg  73  10
  pos  17  18

But what can I do to use confusionMatri() from caret ?

0 Answers
Related