0
$\begingroup$

I am trying to visualize a 3-class confusion matrix for the iris data. The things that I performed.

  1. Partitioned iris into 50% Train, 25% Test, 25% validation.
  2. I used knn to determine which is optimal from a set of k values (1,3,5) by Grid search.
  3. Based on the winner model (obtained with k=1) I want to predict the performance on its test set with a 25% split.

I'm having to generate/ visualizing the confusion matrix for this 3-class problem. When I compile it throws me error as below:

Error in eval(predvars, data, env) : object 'Petal.Width' not found

Cannot figure out where it went wrong.

Code:

library(caret)
library(class)

spec = c(train = .5, test = .25, validate = .25)

byparts = sample(cut(
  seq(nrow(iris)), 
  nrow(iris)*cumsum(c(0,spec)),
  labels = names(spec)
))

res = split(iris, byparts)

addmargins(prop.table(table(byparts)))

classifier = train(form = Species ~ ., data = res$train, method = 'knn', tuneGrid   = expand.grid(k = c(1,3,5)))
classifier

#Confusion Matrix
y_pred = predict(classifier, newdata = res$test[-4])
cm = table(res$test[,4], y_pred)
```
$\endgroup$
2
  • 1
    $\begingroup$ Hi, the Species variable, tyhat is the want that you want to remove for making predictions, has index 5, not 4. So you should write y_pred = predict(classifier, newdata = res$test[-5]) cm = table(res$test[,5], y_pred) And it will work $\endgroup$ Apr 21 at 10:53
  • $\begingroup$ Oh, a silly mistake thanks for the help. Also, would like to know is there a way to visually plot this confusion matrix? $\endgroup$
    – Ranji Raj
    Apr 21 at 10:59
2
$\begingroup$

I an comment the OP asked how to visually plot a 3x3 confusion matrix. There are an aweful lot of alternatives. Some examples (in no way exhaustive) in R to give a starter for your own ideas:

#some example data 
confusion <- data.frame(true = iris$Species, predicted = iris$Species)
confusion$predicted[sample.int(150,40)] <- iris$Species[sample.int(150,40)]
str(confusion)




plot(confusion$true, confusion$predicted)

enter image description here

plot(table(confusion$true, confusion$predicted))

enter image description here

library(ggplot2)
ggplot(confusion) +
  geom_count(aes(x = true, y = predicted)) +
  scale_size_continuous(range=c(0,30))

enter image description here

ggplot(confusion) +
  geom_jitter(aes(x = true, y = predicted), width = .25, height = .25)

enter image description here

library(ggplot2)
ggplot(confusion) +
  geom_count(aes(x = true, y = predicted), color ="lightgrey") +
  scale_size_continuous(range=c(0,30)) +
  geom_jitter(aes(x = true, y = predicted), width = .25, height = .25) + 
  theme_bw()

enter image description here

library(ggplot2)
ggplot(aggregate(confusion, list(confusion$true, confusion$predicted), FUN = length))+
  scale_color_continuous() +
  geom_text(aes(x = Group.1, y = Group.2, label = true, color = true), size = 25) +  
  theme_bw()

enter image description here

$\endgroup$
1
  • 1
    $\begingroup$ This was what I pretty much looking for! Appreciate your time and explanations. $\endgroup$
    – Ranji Raj
    Apr 21 at 12:13

Not the answer you're looking for? Browse other questions tagged or ask your own question.