Uma característica da classificação baseada em instâncias é que o algorítmo classifica de acordo com a proximidade dos dados em tempo real, durante o tempo de execução. O KNN não trabalha com modelos, mas usa os dados históricos na memória, e quando recebe uma instância nova para classificar ele busca no histórico o mais próximo de acordo com o parâmetro indicado.
library(class)
library(e1071)
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
set.seed(88)
n = 10000
a = sample(1:20, n, replace = T)
b = sample(20:45, n, replace = T)
f = ifelse(a > 9 & b > 30, "cítrica",
ifelse(a < 4 | b < 11, "seca", "vermelha"))
df = data.frame(a = a, b = b, flag = as.factor(f))
amostra <- sample(2,n,replace = T,prob = c(0.7,0.3))
treino <- df[amostra==1,]
classificar <- df[amostra==2,]
head(df)
## a b flag
## 1 13 43 cítrica
## 2 7 24 vermelha
## 3 19 26 vermelha
## 4 2 45 seca
## 5 17 36 cítrica
## 6 16 38 cítrica
dim(df)
## [1] 10000 3
“Treino” é onde ele vai buscar a proximidade. Vamos usar o comando dim para verificar as instâncias dos conjuntos treino e o conjunto classificar que é em torno de 70% e 30%
dim(treino)
## [1] 6975 3
dim(classificar)
## [1] 3025 3
Vamos passar os dados de treino, os dados a classificar e a lista de valores de classificação do treino, ou seja, encontrada a instancia mais próxima, onde encontrar a sua classe. O parametro k é número de vizinhos mais próximos a serem considerados quando ele faz a busca no vizinho mais próximo pela distância (normalmente a distância euclidiana)
previsao <- knn(treino[,1:2],classificar[,1:2],treino[,3],k=3)
table(classificar[,3],previsao)
## previsao
## cítrica seca vermelha
## cítrica 1008 0 0
## seca 0 435 0
## vermelha 0 0 1582
Percebemos que nenhum erro aconteceu, todas as frutas foram classificadas corretamente.