# Prevendo a Ocorrência de Câncer
## Etapa 1 - Coletando os Dados
# http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29
# http://datascienceacademy.com.br/blog/aluno/RFundamentos/Datasets/ML/wisc_bc_data.csv
# Os dados do câncer da mama incluem 569 observações de biópsias de câncer,
# cada um com 32 características (variáveis). Uma característica é um número de
# identificação (ID), outro é o diagnóstico de câncer, e 30 são medidas laboratoriais
# numéricas. O diagnóstico é codificado como "M" para indicar maligno ou "B" para
# indicar benigno.
dados <- read.csv("http://datascienceacademy.com.br/blog/aluno/RFundamentos/Datasets/ML/bc_data.csv", stringsAsFactors = FALSE)
str(dados)
## 'data.frame': 569 obs. of 32 variables:
## $ id : int 87139402 8910251 905520 868871 9012568 906539 925291 87880 862989 89827 ...
## $ diagnosis : chr "B" "B" "B" "B" ...
## $ radius_mean : num 12.3 10.6 11 11.3 15.2 ...
## $ texture_mean : num 12.4 18.9 16.8 13.4 13.2 ...
## $ perimeter_mean : num 78.8 69.3 70.9 73 97.7 ...
## $ area_mean : num 464 346 373 385 712 ...
## $ smoothness_mean : num 0.1028 0.0969 0.1077 0.1164 0.0796 ...
## $ compactness_mean : num 0.0698 0.1147 0.078 0.1136 0.0693 ...
## $ concavity_mean : num 0.0399 0.0639 0.0305 0.0464 0.0339 ...
## $ points_mean : num 0.037 0.0264 0.0248 0.048 0.0266 ...
## $ symmetry_mean : num 0.196 0.192 0.171 0.177 0.172 ...
## $ dimension_mean : num 0.0595 0.0649 0.0634 0.0607 0.0554 ...
## $ radius_se : num 0.236 0.451 0.197 0.338 0.178 ...
## $ texture_se : num 0.666 1.197 1.387 1.343 0.412 ...
## $ perimeter_se : num 1.67 3.43 1.34 1.85 1.34 ...
## $ area_se : num 17.4 27.1 13.5 26.3 17.7 ...
## $ smoothness_se : num 0.00805 0.00747 0.00516 0.01127 0.00501 ...
## $ compactness_se : num 0.0118 0.03581 0.00936 0.03498 0.01485 ...
## $ concavity_se : num 0.0168 0.0335 0.0106 0.0219 0.0155 ...
## $ points_se : num 0.01241 0.01365 0.00748 0.01965 0.00915 ...
## $ symmetry_se : num 0.0192 0.035 0.0172 0.0158 0.0165 ...
## $ dimension_se : num 0.00225 0.00332 0.0022 0.00344 0.00177 ...
## $ radius_worst : num 13.5 11.9 12.4 11.9 16.2 ...
## $ texture_worst : num 15.6 22.9 26.4 15.8 15.7 ...
## $ perimeter_worst : num 87 78.3 79.9 76.5 104.5 ...
## $ area_worst : num 549 425 471 434 819 ...
## $ smoothness_worst : num 0.139 0.121 0.137 0.137 0.113 ...
## $ compactness_worst: num 0.127 0.252 0.148 0.182 0.174 ...
## $ concavity_worst : num 0.1242 0.1916 0.1067 0.0867 0.1362 ...
## $ points_worst : num 0.0939 0.0793 0.0743 0.0861 0.0818 ...
## $ symmetry_worst : num 0.283 0.294 0.3 0.21 0.249 ...
## $ dimension_worst : num 0.0677 0.0759 0.0788 0.0678 0.0677 ...
head(dados)
## id diagnosis radius_mean texture_mean perimeter_mean area_mean
## 1 87139402 B 12.32 12.39 78.85 464.1
## 2 8910251 B 10.60 18.95 69.28 346.4
## 3 905520 B 11.04 16.83 70.92 373.2
## 4 868871 B 11.28 13.39 73.00 384.8
## 5 9012568 B 15.19 13.21 97.65 711.8
## 6 906539 B 11.57 19.04 74.20 409.7
## smoothness_mean compactness_mean concavity_mean points_mean
## 1 0.10280 0.06981 0.03987 0.03700
## 2 0.09688 0.11470 0.06387 0.02642
## 3 0.10770 0.07804 0.03046 0.02480
## 4 0.11640 0.11360 0.04635 0.04796
## 5 0.07963 0.06934 0.03393 0.02657
## 6 0.08546 0.07722 0.05485 0.01428
## symmetry_mean dimension_mean radius_se texture_se perimeter_se area_se
## 1 0.1959 0.05955 0.2360 0.6656 1.670 17.43
## 2 0.1922 0.06491 0.4505 1.1970 3.430 27.10
## 3 0.1714 0.06340 0.1967 1.3870 1.342 13.54
## 4 0.1771 0.06072 0.3384 1.3430 1.851 26.33
## 5 0.1721 0.05544 0.1783 0.4125 1.338 17.72
## 6 0.2031 0.06267 0.2864 1.4400 2.206 20.30
## smoothness_se compactness_se concavity_se points_se symmetry_se
## 1 0.008045 0.011800 0.01683 0.012410 0.01924
## 2 0.007470 0.035810 0.03354 0.013650 0.03504
## 3 0.005158 0.009355 0.01056 0.007483 0.01718
## 4 0.011270 0.034980 0.02187 0.019650 0.01580
## 5 0.005012 0.014850 0.01551 0.009155 0.01647
## 6 0.007278 0.020470 0.04447 0.008799 0.01868
## dimension_se radius_worst texture_worst perimeter_worst area_worst
## 1 0.002248 13.50 15.64 86.97 549.1
## 2 0.003318 11.88 22.94 78.28 424.8
## 3 0.002198 12.41 26.44 79.93 471.4
## 4 0.003442 11.92 15.77 76.53 434.0
## 5 0.001767 16.20 15.73 104.50 819.1
## 6 0.003339 13.07 26.98 86.43 520.5
## smoothness_worst compactness_worst concavity_worst points_worst
## 1 0.1385 0.1266 0.12420 0.09391
## 2 0.1213 0.2515 0.19160 0.07926
## 3 0.1369 0.1482 0.10670 0.07431
## 4 0.1367 0.1822 0.08669 0.08611
## 5 0.1126 0.1737 0.13620 0.08178
## 6 0.1249 0.1937 0.25600 0.06664
## symmetry_worst dimension_worst
## 1 0.2827 0.06771
## 2 0.2940 0.07587
## 3 0.2998 0.07881
## 4 0.2102 0.06784
## 5 0.2487 0.06766
## 6 0.3035 0.08284
## Etapa 2 - Explorando os Dados
# Excluindo a coluna ID
# Independentemente do método de aprendizagem de máquina, deve sempre ser excluídas
# variáveis de ID. Caso contrário, isso pode levar a resultados errados porque o ID
# pode ser usado para unicamente "prever" cada exemplo. Por conseguinte, um modelo
# que inclui um identificador pode sofrer de superajuste, e será muito difícil usá-lo para
# generalizar outros dados.
dados <- dados[-1]
str(dados)
## 'data.frame': 569 obs. of 31 variables:
## $ diagnosis : chr "B" "B" "B" "B" ...
## $ radius_mean : num 12.3 10.6 11 11.3 15.2 ...
## $ texture_mean : num 12.4 18.9 16.8 13.4 13.2 ...
## $ perimeter_mean : num 78.8 69.3 70.9 73 97.7 ...
## $ area_mean : num 464 346 373 385 712 ...
## $ smoothness_mean : num 0.1028 0.0969 0.1077 0.1164 0.0796 ...
## $ compactness_mean : num 0.0698 0.1147 0.078 0.1136 0.0693 ...
## $ concavity_mean : num 0.0399 0.0639 0.0305 0.0464 0.0339 ...
## $ points_mean : num 0.037 0.0264 0.0248 0.048 0.0266 ...
## $ symmetry_mean : num 0.196 0.192 0.171 0.177 0.172 ...
## $ dimension_mean : num 0.0595 0.0649 0.0634 0.0607 0.0554 ...
## $ radius_se : num 0.236 0.451 0.197 0.338 0.178 ...
## $ texture_se : num 0.666 1.197 1.387 1.343 0.412 ...
## $ perimeter_se : num 1.67 3.43 1.34 1.85 1.34 ...
## $ area_se : num 17.4 27.1 13.5 26.3 17.7 ...
## $ smoothness_se : num 0.00805 0.00747 0.00516 0.01127 0.00501 ...
## $ compactness_se : num 0.0118 0.03581 0.00936 0.03498 0.01485 ...
## $ concavity_se : num 0.0168 0.0335 0.0106 0.0219 0.0155 ...
## $ points_se : num 0.01241 0.01365 0.00748 0.01965 0.00915 ...
## $ symmetry_se : num 0.0192 0.035 0.0172 0.0158 0.0165 ...
## $ dimension_se : num 0.00225 0.00332 0.0022 0.00344 0.00177 ...
## $ radius_worst : num 13.5 11.9 12.4 11.9 16.2 ...
## $ texture_worst : num 15.6 22.9 26.4 15.8 15.7 ...
## $ perimeter_worst : num 87 78.3 79.9 76.5 104.5 ...
## $ area_worst : num 549 425 471 434 819 ...
## $ smoothness_worst : num 0.139 0.121 0.137 0.137 0.113 ...
## $ compactness_worst: num 0.127 0.252 0.148 0.182 0.174 ...
## $ concavity_worst : num 0.1242 0.1916 0.1067 0.0867 0.1362 ...
## $ points_worst : num 0.0939 0.0793 0.0743 0.0861 0.0818 ...
## $ symmetry_worst : num 0.283 0.294 0.3 0.21 0.249 ...
## $ dimension_worst : num 0.0677 0.0759 0.0788 0.0678 0.0677 ...
any(is.na(dados))
## [1] FALSE
# Muitos classificadores requerem que as variáveis sejam do tipo Fator
table(dados$diagnosis)
##
## B M
## 357 212
dados$diagnosis <- factor(dados$diagnosis, levels = c("B", "M"), labels = c("Benigno", "Maligno"))
str(dados$diagnosis)
## Factor w/ 2 levels "Benigno","Maligno": 1 1 1 1 1 1 1 2 1 1 ...
# Verificando a proporção
round(prop.table(table(dados$diagnosis)) * 100, digits = 1)
##
## Benigno Maligno
## 62.7 37.3
# Medidas de Tendência Cetral
# Detectamos aqui um problema de escala entre os dados, que então precisam ser normalizados
# O cálculo de distância feito pelo kNN é dependente das medidas de escala nos dados de entrada.
summary(dados[c("radius_mean", "area_mean", "smoothness_mean")])
## radius_mean area_mean smoothness_mean
## Min. : 6.981 Min. : 143.5 Min. :0.05263
## 1st Qu.:11.700 1st Qu.: 420.3 1st Qu.:0.08637
## Median :13.370 Median : 551.1 Median :0.09587
## Mean :14.127 Mean : 654.9 Mean :0.09636
## 3rd Qu.:15.780 3rd Qu.: 782.7 3rd Qu.:0.10530
## Max. :28.110 Max. :2501.0 Max. :0.16340
# Criando um função de normalização
normalizar <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
# Testando a função de normalização - os resultados devem ser idênticos
normalizar(c(1, 2, 3, 4, 5))
## [1] 0.00 0.25 0.50 0.75 1.00
normalizar(c(10, 20, 30, 40, 50))
## [1] 0.00 0.25 0.50 0.75 1.00
# Normalizando os dados
dados_norm <- as.data.frame(lapply(dados[2:31], normalizar))
# Confirmando que a normalização funcionou
summary(dados[c("radius_mean", "area_mean", "smoothness_mean")])
## radius_mean area_mean smoothness_mean
## Min. : 6.981 Min. : 143.5 Min. :0.05263
## 1st Qu.:11.700 1st Qu.: 420.3 1st Qu.:0.08637
## Median :13.370 Median : 551.1 Median :0.09587
## Mean :14.127 Mean : 654.9 Mean :0.09636
## 3rd Qu.:15.780 3rd Qu.: 782.7 3rd Qu.:0.10530
## Max. :28.110 Max. :2501.0 Max. :0.16340
summary(dados_norm[c("radius_mean", "area_mean", "smoothness_mean")])
## radius_mean area_mean smoothness_mean
## Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.2233 1st Qu.:0.1174 1st Qu.:0.3046
## Median :0.3024 Median :0.1729 Median :0.3904
## Mean :0.3382 Mean :0.2169 Mean :0.3948
## 3rd Qu.:0.4164 3rd Qu.:0.2711 3rd Qu.:0.4755
## Max. :1.0000 Max. :1.0000 Max. :1.0000
## Etapa 3: Treinando o modelo
# Carregando o pacote library
# install.packages("class")
library(class)
?knn
## starting httpd help server ...
## done
# Criando dados de treino e dados de teste
dados_treino <- dados_norm[1:469, ]
dados_teste <- dados_norm[470:569, ]
# Criando os labels para os dados de treino e de teste
dados_treino_labels <- dados[1:469, 1]
dados_teste_labels <- dados[470:569, 1]
length(dados_treino_labels)
## [1] 469
length(dados_teste_labels)
## [1] 100
# Criando o modelo
modelo <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 21)
# A função knn() retorna um objeto do tipo fator com as previsões para cada exemplo no dataset de teste
class(modelo)
## [1] "factor"
## Etapa 4: Avaliando e Interpretando o Modelo
# Carregando o gmodels
#install.packages("gmodels")
library(gmodels)
# Criando uma tabela cruzada dos dados previstos x dados atuais
# Usaremos amostra com 100 observações: length(dados_teste_labels)
CrossTable(x = dados_teste_labels, y = modelo, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.968 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 2 | 37 | 39 |
## | 0.051 | 0.949 | 0.390 |
## | 0.032 | 1.000 | |
## | 0.020 | 0.370 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 63 | 37 | 100 |
## | 0.630 | 0.370 | |
## -------------------|-----------|-----------|-----------|
##
##
# Interpretando os Resultados
# A tabela cruzada mostra 4 possíveis valores, que representam os falso/verdadeiro positivo e negativo
# A primeira coluna lista os labels originais nos dados observados
# As duas colunas do modelo (Benigno e Maligno) do modelo, mostram os resultados da previsão
# Temos:
# Cenário 1: Célula Benigno (label) x Benigno (Modelo) - 61 casos - true negative
# Cenário 2: Célula Benigno (label) x Maligno (Modelo) - 00 casos - false positive
# Cenário 3: Célula Maligno (label) x Benigno (Modelo) - 02 casos - false negative (o modelo errou)
# Cenário 4: Célula Maligno (label) x Maligno (Modelo) - 37 casos - true positive
# Lendo a Confusion Matrix (Perspectva de ter ou não a doença):
# True Negative = nosso modelo previu que a pessoa NÃO tinha a doença e os dados mostraram que realmente a pessoa NÃO tinha a doença
# False Positive = nosso modelo previu que a pessoa tinha a doença e os dados mostraram que NÃO, a pessoa tinha a doença
# False Negative = nosso modelo previu que a pessoa NÃO tinha a doença e os dados mostraram que SIM, a pessoa tinha a doença
# True Positive = nosso modelo previu que a pessoa tinha a doença e os dados mostraram que SIM, a pessoa tinha a doença
# Falso Positivo - Erro Tipo I
# Falso Negativo - Erro Tipo II
# Taxa de acerto do Modelo: 98% (acertou 98 em 100)
# Consulte a definição de confusion matrix em caso de dúvidas!!!
## Etapa 5: Otimizando a performance do modelo
# Usando a função scale() para padronizar o z-score
?scale()
dados_z <- as.data.frame(scale(dados[-1]))
# Confirmando transformação realizada com sucesso
summary(dados_z$area_mean)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1.4530 -0.6666 -0.2949 0.0000 0.3632 5.2460
# Criando novos datasets de treino e de teste
dados_treino <- dados_z[1:469, ]
dados_teste <- dados_z[470:569, ]
dados_treino_labels <- dados[ 1: 469, 1]
dados_teste_labels <- dados[ 470: 569, 1]
# Reclassificando
modelo_v2 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 21)
# Criando uma tabela cruzada dos dados previstos x dados atuais
CrossTable(x = dados_teste_labels, y = modelo_v2, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v2
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.924 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 5 | 34 | 39 |
## | 0.128 | 0.872 | 0.390 |
## | 0.076 | 1.000 | |
## | 0.050 | 0.340 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 66 | 34 | 100 |
## | 0.660 | 0.340 | |
## -------------------|-----------|-----------|-----------|
##
##
# Testando diferentes valores para k
# Criando dados de treino e dados de teste
dados_treino <- dados_norm[1:469, ]
dados_teste <- dados_norm[470:569, ]
# Criando os labels para os dados de treino e de teste
dados_treino_labels <- dados[1:469, 1]
dados_teste_labels <- dados[470:569, 1]
# Valores diferentes para k
modelo_v3 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 1)
CrossTable(x = dados_teste_labels, y = modelo_v3, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v3
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 58 | 3 | 61 |
## | 0.951 | 0.049 | 0.610 |
## | 0.983 | 0.073 | |
## | 0.580 | 0.030 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 1 | 38 | 39 |
## | 0.026 | 0.974 | 0.390 |
## | 0.017 | 0.927 | |
## | 0.010 | 0.380 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 59 | 41 | 100 |
## | 0.590 | 0.410 | |
## -------------------|-----------|-----------|-----------|
##
##
modelo_v4 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 5)
CrossTable(x = dados_teste_labels, y = modelo_v4, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v4
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.968 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 2 | 37 | 39 |
## | 0.051 | 0.949 | 0.390 |
## | 0.032 | 1.000 | |
## | 0.020 | 0.370 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 63 | 37 | 100 |
## | 0.630 | 0.370 | |
## -------------------|-----------|-----------|-----------|
##
##
modelo_v5 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 11)
CrossTable(x = dados_teste_labels, y = modelo_v5, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v5
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.953 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 3 | 36 | 39 |
## | 0.077 | 0.923 | 0.390 |
## | 0.047 | 1.000 | |
## | 0.030 | 0.360 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 64 | 36 | 100 |
## | 0.640 | 0.360 | |
## -------------------|-----------|-----------|-----------|
##
##
modelo_v6 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 15)
CrossTable(x = dados_teste_labels, y = modelo_v6, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v6
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.953 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 3 | 36 | 39 |
## | 0.077 | 0.923 | 0.390 |
## | 0.047 | 1.000 | |
## | 0.030 | 0.360 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 64 | 36 | 100 |
## | 0.640 | 0.360 | |
## -------------------|-----------|-----------|-----------|
##
##
modelo_v7 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 27)
CrossTable(x = dados_teste_labels, y = modelo_v7, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v7
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.938 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 4 | 35 | 39 |
## | 0.103 | 0.897 | 0.390 |
## | 0.062 | 1.000 | |
## | 0.040 | 0.350 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 65 | 35 | 100 |
## | 0.650 | 0.350 | |
## -------------------|-----------|-----------|-----------|
##
##
modelo_v2 <- knn(train = dados_treino,
test = dados_teste,
cl = dados_treino_labels,
k = 21)
CrossTable(x = dados_teste_labels, y = modelo_v2, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 100
##
##
## | modelo_v2
## dados_teste_labels | Benigno | Maligno | Row Total |
## -------------------|-----------|-----------|-----------|
## Benigno | 61 | 0 | 61 |
## | 1.000 | 0.000 | 0.610 |
## | 0.968 | 0.000 | |
## | 0.610 | 0.000 | |
## -------------------|-----------|-----------|-----------|
## Maligno | 2 | 37 | 39 |
## | 0.051 | 0.949 | 0.390 |
## | 0.032 | 1.000 | |
## | 0.020 | 0.370 | |
## -------------------|-----------|-----------|-----------|
## Column Total | 63 | 37 | 100 |
## | 0.630 | 0.370 | |
## -------------------|-----------|-----------|-----------|
##
##
## Calculando a taxa de erro
prev = NULL
taxa_erro = NULL
suppressWarnings(
for(i in 1:30){
set.seed(101)
prev = knn(train = dados_treino, test = dados_teste, cl = dados_treino_labels, k = i)
taxa_erro[i] = mean(dados$diagnosis != prev)
})
# Obtendo os valores de k e das taxas de erro
library(ggplot2)
k.values <- 1:30
df_erro <- data.frame(taxa_erro, k.values)
df_erro
## taxa_erro k.values
## 1 0.4868190 1
## 2 0.4780316 2
## 3 0.4780316 3
## 4 0.4674868 4
## 5 0.4710018 5
## 6 0.4674868 6
## 7 0.4692443 7
## 8 0.4674868 8
## 9 0.4692443 9
## 10 0.4674868 10
## 11 0.4674868 11
## 12 0.4674868 12
## 13 0.4674868 13
## 14 0.4604569 14
## 15 0.4604569 15
## 16 0.4604569 16
## 17 0.4604569 17
## 18 0.4604569 18
## 19 0.4604569 19
## 20 0.4604569 20
## 21 0.4674868 21
## 22 0.4604569 22
## 23 0.4604569 23
## 24 0.4604569 24
## 25 0.4604569 25
## 26 0.4622144 26
## 27 0.4622144 27
## 28 0.4622144 28
## 29 0.4622144 29
## 30 0.4622144 30
# À medida que aumentamos k, diminuímos a taxa de erro do modelo
ggplot(df_erro, aes(x = k.values, y = taxa_erro)) + geom_point()+ geom_line(lty = "dotted", color = 'red')
