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 ?