#Lendo os dados
penguins <- read.csv('palmerpenguins.csv', sep = ',')
#Transformando e corrigindo os nomes das espécies
penguins <- penguins |>
mutate(species = str_to_title(species), sex = str_to_title(sex))Palmer Penguins: Uma avaliação exploratória dos dados, um modelo supervisionado.
1 Introdução ao problema
Vamos explorar alguns dados sobre uma pesquisa realizada, com o intuito de identificar as 3 espécies de pinguins existentes em 3 ilhas catalogadas, e com isso podermos criar um modelo que nos traga a possível classificação de qualquer uma das especies com base nas características.
Este conjunto de dados que iremos abordar possui informações sobre 333 pinguins.
Vamos importar os dados e já realizar a modificação da variável espécie, padonizar a escrita.
2 Começaremos por uma exploração gráfica das variáveis
Aqui vamos observar os Gráfico em Boxplot, para podermos identificar algumas divergências ou similaridades.
ggplot(data = penguins, aes(x = species, y = bill_length_mm)) +
geom_boxplot(fill = "blue", alpha = 0.7) +
labs(title = "Comprimento do Bico por Espécie",
x = "Espécie", y = "Comprimento do Bico (mm)") +
theme_minimal()No que diz respeito a ao cumprimento do bico por espécie, percebemos que as espécies Chrinstrap e Gentoo, possui uma similaridade em no comprimento dos bicos, pois sua médias podem estão 45 a 52 mm aproximadamente, o que pode ser um problema na modelagem, se usarmos somente essa variável.
A variável Comprimento do Bico, demonstra ser uma ótima divisora entre as espécies Adelie e Chinstrap.
ggplot(data = penguins, aes(x = species, y = bill_depth_mm)) +
geom_boxplot(fill = "green", alpha = 0.7) +
labs(title = "Profundidade do Bico por Espécie",
x = "Espécie", y = "Profundidade do Bico (mm)") +
theme_minimal()Agora quando olhamos para a profundidade do bico por espécie, percebemos que a Adelie e a Chinstrap, estão com uma média igual, ou seja, uma pode está dentro da outra, o pode não ser decisivo em uma modelagem, deveremos talvez separar essa duas espécie por outra variável.
ggplot(data = penguins, aes(x = species, y = flipper_length_mm)) +
geom_boxplot(fill = "red", alpha = 0.7) +
labs(title = "Comprimento da Nadadeira por Espécie",
x = "Espécie", y = "Comprimento da Nadadeira (mm)") +
theme_minimal()Talvez uma poderá haver uma divisão boa das espécie pelo cumprimento das nadadeiras, mesmo havendo uma composição entre os dados da espécie Adelie e Chinstrap, ainda a um distanciamento entre suas média conforme o gráfico acima, ou pelo menos para distinguir bem a espécie Gentoo das outras.
ggplot(data = penguins, aes(x = species, y = body_mass_g)) +
geom_boxplot(fill = "purple", alpha = 0.7) +
labs(title = "Massa Corporal por Espécie",
x = "Espécie", y = "Massa Corporal (g)") +
theme_minimal()Outra variável boa para separa Gentoo das outras espécies, é a Massa Corporal, demonstrando ser uma boa variável.
Em resumo, observando os gráfico acima, vimos que para a espécie Gentoo, possuímos boas variáveis, que podem nos auxiliar na modelagem, e com ser bem decisivo na hora de colocarmos nosso modelo em prética para, nos trazer com base na informações que imputarmos, agor, a para as espécie Adelie e Chinstrap, vimos que não será só uma variável que pode definir a espécie, e sim um conjunto delas.
3 Um visão de como esta a dispersão dos dados com base em algumas variáveis.
ggplot(data = penguins, aes(x = bill_length_mm, y = bill_depth_mm, color = species)) +
geom_point() +
labs(title = "Dispersão do Comprimento vs. Profundidade do Bico",
x = "Comprimento do Bico (mm)",
y = "Profundidade do Bico (mm)") +
theme_minimal()Quando cruzamos os dados relacionados ao Bico, temos uma boa divisão entre as espécie, sendo esse cruzamento um ótimo par, para tomada de decisão, mas, ainda a uma zona de confusão.
ggplot(data = penguins, aes(x = flipper_length_mm, y = body_mass_g, color = species)) +
geom_point() +
labs(title = "Dispersão do Comprimento da Nadadeira vs. Massa Corporal",
x = "Comprimento da Nadadeira (mm)", y = "Massa Corporal (g)") +
theme_minimal()Como vimos, tanto no BOXPLOT quanto na DISPERSÃO, quando cruzamos a MASSA CORPORAL e COMPRIMENTO DA NADADEIRA, observamos que não a uma boa divisão entre Adelie e Chintrap, devido a possuirem média iguais para a variável MASSA CORPORAL, já o COMPRIMENTO DA NADADEIRA percebemos que a uma são bem próximos, porém, esse cruzamento de dados, é uma boa solução para a espécie Gentoo.
ggplot(data = penguins, aes(x = flipper_length_mm, y = body_mass_g, color = island)) +
geom_point() +
labs(title = "Comprimento da Nadadeira vs. Peso Corporal dos Pinguins por Ilha",
subtitle = "Relação entre comprimento da nadadeira e peso corporal por ilha",
x = "Comprimento da Nadadeira (mm)",
y = "Peso Corporal (g)",
color = "Ilha") +
theme_minimal()ggplot(data = penguins, aes(x = bill_length_mm, y = bill_depth_mm, color = island)) +
geom_point() +
labs(title = "Dispersão do Comprimento vs. Profundidade do Bico",
x = "Comprimento do Bico (mm)",
y = "Profundidade do Bico (mm)",
color = "Ilha") +
theme_minimal()Indo um pouco mais além, quando levamos algumas variáveis e colocamos como resposta a ilha, percebemos também uma alguns dados confusos, mas, ainda podemos uma boa separação na ilha de Biscoe.
4 Ainda sobre Gráfico exploratórios, uma visão combinada da Frequência observada.
ggplot(data = penguins, aes(x = bill_depth_mm)) +
geom_histogram(binwidth = 1, fill = "green", alpha = 0.7) +
labs(title = "Profundidade do Bico", x = "Profundidade do Bico (mm)", y = "Frequência") +
theme_minimal()ggplot(data = penguins, aes(x = bill_length_mm)) +
geom_histogram(binwidth = 1, fill = "blue", alpha = 0.7) +
labs(title = "Comprimento do Bico", x = "Comprimento do Bico (mm)", y = "Frequência") +
theme_minimal()Algo bem interessante de se observar quando se trata do histograma do Comprimento do Bico, é que o mesmo parece ter duas distribuição normal, como se os dados possuissem ou pudessem ter duas médias.
ggplot(data = penguins, aes(x = flipper_length_mm)) +
geom_histogram(binwidth = 5, fill = "red", alpha = 0.7) +
labs(title = "Comprimento da Nadadeira", x = "Comprimento da Nadadeira (mm)", y = "Frequência") +
theme_minimal()ggplot(data = penguins, aes(x = body_mass_g)) +
geom_histogram(binwidth = 200, fill = "purple", alpha = 0.7) +
labs(title = "Massa Corporal", x = "Massa Corporal (g)", y = "Frequência") +
theme_minimal()O que podemos dizer, sobre esses Gráfico, é que quando olhamos somente 1 variável por vez, temos uma distribuição assimétrica as vezes a esquerda e as vezes a direita, mas nunca temos uma distribuição que se assemelha a normalidade, mas, quando olhamos em duplas, percebemos que a uma melhor distribuição dos dados.
5 Vamos começar a Modelagem do KNN
Começaremos selecionando apenas variáveis numéricas e a variável alvo Specie. Para que possamos trabalhar melhor o nosso modelo, e já vamos verificar es a extração esta correta.
penguins <- penguins |>
select(species, bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g)
# Verificar as primeiras linhas
head(penguins) species bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
1 Adelie 36.6 17.8 185 3700
2 Adelie 34.6 17.2 189 3200
3 Adelie 37.0 16.5 185 3400
4 Adelie 38.3 19.2 189 3950
5 Adelie 45.8 18.9 197 4150
6 Adelie 41.3 20.3 194 3550
Normalizaremos os dados númericos, pois, com isso o nosso modelo KNN poderá ter mais eficiência nos resultados, e evitaremos qualquer problema.
penguinsnormalizados <- penguins |>
mutate(across(c(bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g), scale))Agora iremos realizar a limpeza de possíveis NA, para evitarmos problemas no modelo a ser implementado.
penguinsnormalizados <- na.omit(penguinsnormalizados)
head(penguinsnormalizados) species bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
1 Adelie -1.3518452 0.32252879 -1.1392148 -0.62971573
2 Adelie -1.7175649 0.01784202 -0.8538219 -1.25066728
3 Adelie -1.2787012 -0.33762588 -1.1392148 -1.00228666
4 Adelie -1.0409834 1.03346460 -0.8538219 -0.31923996
5 Adelie 0.3304657 0.88112121 -0.2830361 -0.07085934
6 Adelie -0.4924037 1.59205702 -0.4970807 -0.81600120
Criamos uma semente de aleatoriedade com o código, e iniciamos ela com a hora relógios 17:31, para que possamos evitar de termos resultados diferentes sempre que processarmos os dados.
set.seed(1731)Embaralhamos nos dados para que o nosso modelo não fique tendencioso, também separaremos os dados que será para teste e treino, garantindo que 80% seja para treino do modelo e 20% para o teste.
Dadosnormalizados <- penguinsnormalizados[sample(1:nrow(penguinsnormalizados)), ]
n <- round(0.8 * nrow(Dadosnormalizados))
n[1] 266
Feito o passo anterior vamos incluir os dados em treino e teste, sendo 1:n para treino e -(1:n) para teste, além disso vamos também retirar a variável espécie de ambos para que não tenhamos problema no modelo, estamos verificando também se a divisão esta correta.
treino <- Dadosnormalizados[1:n, ]
teste <- Dadosnormalizados[-(1:n), ]
treino1 <- treino |> select(-species)
treino1 bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
33 -1.333559166 1.08424573 -0.568428966 -0.940191505
114 -1.918710760 0.93190234 -0.782473646 -0.753906041
214 -0.419259799 -1.25168621 0.644490889 0.612187369
238 2.853931932 -0.08372024 2.071455424 2.288756553
297 0.476753579 0.32252879 -0.568428966 -0.505525421
154 0.842473326 -0.59153153 2.071455424 1.978280778
44 -1.754136874 0.62721557 -1.210563007 -1.095429393
99 -1.516419039 0.42409105 0.073705075 -0.816001196
118 -0.455831774 0.57643444 -0.425732512 0.115426129
196 1.299623009 -0.33762588 1.714714291 1.295234073
150 1.007047212 -0.54075040 1.643366064 1.791995313
13 -0.675263622 0.67799669 -0.354384285 0.177521284
268 0.751043389 -0.38840701 -0.140339605 -1.095429393
113 -0.528975723 0.98268347 -0.925170100 -0.132954491
264 0.952189250 -0.99778056 1.429321384 2.599232327
322 1.061905174 0.06862315 -0.211687832 -0.660763308
203 1.061905174 -0.64231266 2.000107198 2.164566243
192 0.860759313 -0.74387492 0.501794436 1.419424383
273 0.367037656 0.88112121 -0.425732512 -0.070859336
89 -1.534705026 0.17018541 -0.711125419 -1.281714858
132 -0.364401838 1.18580798 -0.068991378 -0.195049646
303 1.244765047 0.93190234 0.644490889 -0.132954491
69 -0.949553432 1.43971363 -0.782473646 -0.319239956
183 0.513325554 -0.89621830 1.001232023 1.171043763
106 -0.528975723 0.52565331 -0.639777193 -0.195049646
291 1.464196895 0.93190234 -0.283036059 -0.070859336
233 0.092747846 -1.25168621 0.929883796 0.798472833
59 -2.174714583 -0.84543717 -0.925170100 -1.436952745
68 -0.400973812 1.13502686 -0.211687832 0.301711594
269 0.385323643 0.52565331 -1.638652367 -1.188572125
211 0.988761225 -0.69309379 1.072580250 0.891615566
207 1.299623009 -0.43918814 1.357973157 2.226661398
37 -1.168985280 1.08424573 -1.424607687 -1.126476970
331 -0.090112028 0.47487218 0.073705075 -1.002286660
200 1.116763136 -1.09934282 1.714714291 0.984758298
251 1.007047212 -0.48996927 2.000107198 1.978280778
34 -1.424989102 -0.54075040 -0.996518326 -0.816001196
206 0.769329377 -0.79465604 1.429321384 1.108948608
181 1.098477149 -0.99778056 1.215276703 1.854090468
45 -1.150699292 0.77955895 -1.495955914 -0.753906041
60 -0.437545787 0.42409105 -0.639777193 -0.319239956
309 2.159064413 1.33815137 0.430446209 -0.257144801
234 0.001317909 -1.81027862 0.501794436 0.177521284
67 -0.986125407 0.01784202 -0.140339605 -0.567620576
254 1.171621098 -0.94699943 1.643366064 1.667805003
164 0.933903263 -1.35324846 0.787187343 0.519044636
241 0.586469503 -0.84543717 1.001232023 0.953710721
329 1.135049123 0.77955895 -0.211687832 -0.536572998
56 -1.077555343 -0.33762588 -0.211687832 -0.474477843
121 -1.278701204 -0.13450137 -1.139214780 -1.499047900
174 0.403609630 -1.35324846 0.573142662 0.736377679
324 1.263051034 0.37330992 -0.354384285 -0.660763308
289 2.561356135 0.32252879 -1.424607687 -0.629715731
256 1.135049123 -1.45481072 1.215276703 1.854090468
317 0.549897529 0.06862315 -1.139214780 -0.629715731
275 0.257321732 0.77955895 -0.925170100 -0.847048773
145 -1.516419039 -0.13450137 -1.139214780 -1.312762435
137 0.293893706 1.59205702 -0.711125419 0.487997059
87 -0.620405660 0.83034008 -0.568428966 -0.505525421
298 1.336194984 0.52565331 -0.283036059 -0.567620576
70 -0.309543876 2.04908718 -0.711125419 -0.070859336
186 0.202463770 -1.40402959 0.644490889 0.239616439
130 -0.236399926 0.57643444 -0.354384285 -0.164002068
4 -1.040983369 1.03346460 -0.853821873 -0.319239956
3 -1.278701204 -0.33762588 -1.139214780 -1.002286660
65 -0.912981457 -0.03293911 -0.711125419 -1.436952745
258 0.513325554 -0.54075040 1.001232023 1.605709848
312 1.445910908 1.18580798 0.359097982 -0.319239956
202 0.933903263 -1.20090508 1.357973157 1.171043763
131 -1.479847064 -0.28684476 -0.782473646 -1.436952745
64 -1.114127318 0.72877782 -2.066741728 -1.312762435
63 -0.455831774 0.67799669 0.002356848 -0.257144801
266 1.866488616 1.84596266 0.002356848 0.115426129
38 -0.949553432 0.01784202 -1.495955914 -0.505525421
229 0.769329377 -1.45481072 0.644490889 0.487997059
325 -0.565547698 -0.28684476 -0.996518326 -1.250667280
52 -1.589562988 0.88112121 -0.996518326 -0.505525421
239 0.513325554 -1.45481072 1.001232023 0.798472833
55 -0.876409483 0.72877782 -0.782473646 0.053330974
215 0.659613453 -1.35324846 1.001232023 1.481519538
257 -0.364401838 -1.86105975 0.644490889 -0.070859336
235 0.330465681 -1.30246733 0.644490889 -0.008764181
122 -0.876409483 1.99830605 -0.354384285 -0.070859336
123 -1.406703115 1.18580798 -0.782473646 -0.505525421
142 -1.991854709 -0.54075040 -1.638652367 -1.623238210
274 1.116763136 0.37330992 -0.782473646 -1.002286660
93 -1.223843242 -0.18528250 -0.639777193 -1.499047900
301 1.281337022 0.83034008 0.145053302 -0.132954491
250 0.860759313 -1.04856169 1.500669610 1.419424383
230 1.171621098 -0.74387492 1.500669610 1.916185623
84 -0.602119673 -0.08372024 -0.782473646 -0.598668153
227 0.751043389 -1.04856169 0.573142662 1.605709848
288 1.464196895 1.79518153 0.644490889 0.736377679
24 -0.803265533 1.79518153 -0.711125419 -0.381335111
71 -0.474117761 0.72877782 -0.711125419 -0.629715731
253 0.805901351 -1.40402959 0.145053302 0.519044636
23 -1.552991014 0.17018541 -0.782473646 -0.629715731
66 -0.620405660 0.72877782 -1.281911233 -0.816001196
88 -1.351845153 0.62721557 -1.210563007 -0.909143928
290 1.336194984 1.38893250 -0.211687832 -0.629715731
259 1.244765047 -0.74387492 1.786062517 1.233138918
103 -0.474117761 0.67799669 0.073705075 -0.412382688
28 -1.461561077 0.37330992 -0.782473646 -0.940191505
167 0.458467592 -1.20090508 1.143928476 1.233138918
271 1.500768870 0.83034008 -0.283036059 -0.940191505
243 0.403609630 -1.55637298 1.143928476 0.208568861
295 1.189907085 0.62721557 -0.068991378 -1.002286660
277 0.824187339 0.17018541 -0.711125419 -1.002286660
36 -0.272971901 1.79518153 -0.283036059 0.363806749
41 -1.187271267 0.67799669 -0.140339605 0.332759171
173 0.220749757 -0.38840701 1.572017837 2.164566243
219 0.879045301 -0.48996927 1.500669610 2.226661398
223 0.220749757 -0.69309379 1.001232023 1.357329228
161 0.220749757 -1.20090508 0.787187343 1.233138918
194 0.476753579 -1.50559185 0.644490889 0.798472833
228 0.531611541 -1.30246733 1.500669610 0.829520411
136 -0.528975723 0.72877782 -0.853821873 -1.095429393
188 0.330465681 -1.50559185 1.286624930 0.612187369
11 -1.370131140 0.42409105 -1.353259460 -1.312762435
182 1.189907085 -0.64231266 1.500669610 1.667805003
73 -0.144969990 0.67799669 -0.639777193 -0.132954491
96 -0.565547698 -0.18528250 -0.711125419 -0.629715731
293 0.952189250 0.52565331 -0.425732512 0.239616439
231 0.641327465 -1.09934282 1.215276703 0.922663143
159 -0.071826040 -1.65793524 1.143928476 0.860567988
107 -1.516419039 -0.08372024 -0.853821873 -1.064381815
315 0.312179694 0.06862315 -0.568428966 -0.753906041
189 0.257321732 -1.30246733 0.715839116 0.736377679
236 -0.236399926 -1.75949750 0.501794436 -0.319239956
307 0.348751668 -0.03293911 -0.782473646 -0.784953618
267 0.293893706 1.13502686 -0.497080739 -0.847048773
165 0.805901351 -0.43918814 1.357973157 1.481519538
57 -1.461561077 0.32252879 -0.425732512 -0.940191505
314 0.440181605 0.72877782 -0.782473646 -0.940191505
281 1.263051034 0.98268347 -0.354384285 -0.816001196
270 0.275607719 -0.08372024 -0.354384285 -0.878096351
39 -0.218113939 0.67799669 -0.425732512 0.053330974
46 -0.199827952 0.22096653 -0.354384285 0.612187369
129 -1.132413305 0.57643444 -1.924045274 -1.002286660
313 1.135049123 0.83034008 0.073705075 -0.505525421
22 -0.986125407 2.04908718 -0.711125419 -0.505525421
147 0.805901351 -1.30246733 0.858535569 2.040375933
48 -0.565547698 0.88112121 -1.210563007 -0.381335111
109 -0.894695470 0.77955895 -1.424607687 -0.567620576
170 0.385323643 -2.01340314 0.715839116 0.363806749
95 -1.242129229 1.13502686 -1.210563007 -0.381335111
287 1.189907085 1.23658911 0.002356848 -0.195049646
308 1.025333199 0.52565331 -0.568428966 -0.536572998
75 -1.150699292 1.33815137 -0.211687832 -0.878096351
242 0.202463770 -1.35324846 1.001232023 0.984758298
18 0.019603896 1.28737024 -0.354384285 0.239616439
179 0.440181605 -1.09934282 1.072580250 0.612187369
218 0.458467592 -1.86105975 0.644490889 0.425901904
158 -0.035254066 -1.65793524 0.501794436 0.115426129
160 1.098477149 -0.94699943 1.357973157 1.667805003
263 0.421895617 -0.69309379 1.001232023 1.046853453
180 0.604755491 -0.94699943 1.500669610 1.295234073
195 0.586469503 -1.75949750 0.929883796 0.891615566
42 -1.644420950 0.37330992 -0.782473646 -0.940191505
296 0.403609630 0.17018541 -0.996518326 -0.691810886
247 -0.090112028 -1.50559185 1.357973157 0.612187369
43 -0.693549609 -0.08372024 -1.781348821 -0.940191505
27 -1.132413305 1.43971363 -0.782473646 0.053330974
213 -0.108398015 -1.40402959 1.215276703 0.487997059
82 0.019603896 0.42409105 0.644490889 -0.257144801
176 0.202463770 -1.35324846 0.430446209 1.046853453
104 -1.168985280 0.98268347 -0.497080739 -0.567620576
47 -0.803265533 0.47487218 -1.067866553 0.301711594
15 -0.638691647 0.88112121 -1.495955914 -0.319239956
212 0.458467592 -1.35324846 0.858535569 0.239616439
110 -0.693549609 1.49049476 -0.068991378 -0.288192378
222 0.458467592 -1.40402959 1.143928476 0.860567988
98 -0.876409483 1.23658911 -0.425732512 0.581139791
102 -1.626134963 1.13502686 -0.568428966 -0.008764181
117 -0.492403749 1.99830605 -0.425732512 0.239616439
244 0.824187339 -1.09934282 1.286624930 0.798472833
86 -1.059269356 1.43971363 -0.782473646 -0.381335111
120 -0.986125407 -0.08372024 -0.925170100 -1.623238210
172 0.275607719 -1.75949750 0.929883796 0.550092214
101 -1.388417128 -0.03293911 -1.210563007 -1.685333365
175 0.915617275 -0.54075040 1.072580250 1.667805003
302 -0.144969990 -0.28684476 -0.996518326 -1.623238210
240 1.500768870 -0.03293911 1.928758971 1.481519538
245 0.312179694 -1.65793524 0.929883796 0.239616439
255 0.824187339 -1.55637298 1.357973157 1.357329228
143 -1.552991014 -0.48996927 -0.425732512 -1.064381815
261 0.275607719 -1.09934282 1.357973157 0.984758298
232 0.641327465 -1.60715411 0.787187343 0.829520411
19 -1.333559166 0.83034008 -0.996518326 -0.505525421
208 0.677899440 -1.09934282 1.072580250 0.674282524
166 0.860759313 -1.55637298 0.644490889 0.301711594
198 2.031062502 -0.59153153 2.071455424 2.040375933
79 -1.644420950 0.37330992 -0.639777193 -0.598668153
265 1.098477149 -0.43918814 2.071455424 1.854090468
246 1.226479060 -1.09934282 1.572017837 1.667805003
51 -0.766693559 0.98268347 -1.210563007 0.550092214
100 -0.528975723 0.17018541 -0.782473646 -0.381335111
318 1.153335110 1.43971363 -0.283036059 -1.126476970
54 -0.528975723 0.47487218 0.287749755 0.115426129
83 -1.077555343 0.72877782 -0.782473646 -0.629715731
94 -0.711835597 0.88112121 -0.925170100 0.115426129
62 -0.620405660 0.93190234 -0.140339605 -0.257144801
6 -0.492403749 1.59205702 -0.497080739 -0.816001196
21 -0.949553432 0.22096653 -0.711125419 -1.157524548
50 -0.821551521 0.11940428 -1.067866553 -0.505525421
248 0.275607719 -1.35324846 0.787187343 0.674282524
226 0.970475237 -0.74387492 1.143928476 2.040375933
321 0.513325554 -0.33762588 -0.853821873 -0.691810886
326 0.659613453 0.57643444 -0.425732512 -0.443430266
77 -1.315273178 0.67799669 -0.568428966 -0.878096351
105 -1.479847064 1.03346460 -0.853821873 -0.505525421
78 -0.912981457 0.17018541 -1.067866553 -0.816001196
221 0.275607719 -1.65793524 0.644490889 -0.008764181
279 1.208193072 1.13502686 -0.568428966 -0.505525421
323 1.226479060 1.28737024 0.145053302 -0.195049646
119 -1.132413305 0.47487218 -0.568428966 -0.567620576
204 -0.199827952 -2.06418427 1.001232023 0.984758298
49 -0.583833685 0.88112121 0.501794436 0.115426129
135 -0.163255977 1.03346460 -0.283036059 -0.878096351
8 0.367037656 2.20143056 -0.497080739 -0.008764181
306 1.738486705 1.38893250 0.287749755 0.363806749
249 -0.126684002 -1.60715411 0.501794436 0.456949481
85 -1.370131140 -0.28684476 -1.424607687 -1.685333365
177 0.933903263 -1.09934282 1.928758971 1.605709848
61 -1.461561077 -0.03293911 -0.996518326 -0.629715731
162 0.165891795 -1.96262201 0.858535569 1.108948608
139 -0.327829863 1.18580798 -0.283036059 0.084378551
286 0.641327465 -0.18528250 -0.140339605 -0.381335111
141 -0.327829863 0.67799669 -1.495955914 -0.816001196
316 1.610484794 1.43971363 0.287749755 0.425901904
140 -1.607848976 -0.64231266 -1.067866553 -1.436952745
111 -0.803265533 0.01784202 -0.354384285 -0.816001196
262 -0.144969990 -1.35324846 0.501794436 0.301711594
327 0.440181605 0.32252879 -0.711125419 -0.629715731
128 -1.424989102 0.06862315 -0.996518326 -1.126476970
5 0.330465681 0.88112121 -0.283036059 -0.070859336
112 -1.223843242 0.32252879 -0.711125419 -1.064381815
1 -1.351845153 0.32252879 -1.139214780 -0.629715731
115 -0.620405660 0.01784202 -0.996518326 -0.909143928
220 0.641327465 -1.50559185 0.573142662 0.487997059
284 1.409338933 1.59205702 -0.497080739 -0.536572998
332 0.458467592 0.37330992 -0.639777193 -0.878096351
210 0.239035744 -1.75949750 0.644490889 0.115426129
330 0.220749757 0.32252879 -0.211687832 -0.319239956
187 0.165891795 -1.70871637 0.787187343 0.674282524
29 -0.547261711 1.43971363 0.145053302 0.643234946
304 0.220749757 -0.28684476 -0.711125419 -1.188572125
190 0.495039567 -0.94699943 1.286624930 1.233138918
152 1.098477149 -0.64231266 1.643366064 1.419424383
209 0.239035744 -1.70871637 0.501794436 -0.008764181
294 -0.272971901 -0.23606363 -0.996518326 -1.064381815
278 1.098477149 1.18580798 -0.354384285 -0.381335111
185 -0.254685914 -1.75949750 0.858535569 0.922663143
191 0.385323643 -1.04856169 1.001232023 1.108948608
31 -0.967839419 0.93190234 -0.425732512 -0.940191505
237 1.482482882 -0.08372024 2.071455424 1.667805003
156 1.555626832 -0.79465604 1.429321384 1.543614693
260 -0.126684002 -1.91184088 0.573142662 0.239616439
272 0.495039567 0.37330992 -0.425732512 -1.126476970
299 1.354480971 0.93190234 0.002356848 -0.319239956
74 -1.827280824 -0.03293911 -1.139214780 -1.002286660
125 -0.931267445 0.32252879 -1.424607687 -0.722858463
282 1.007047212 0.93190234 -0.068991378 -0.505525421
283 1.043619187 0.72877782 -0.425732512 -0.753906041
81 -1.077555343 -0.08372024 -1.424607687 -1.281714858
225 -0.090112028 -0.99778056 0.858535569 0.550092214
treino2 <- treino$species
treino2 [1] "Adelie" "Adelie" "Gentoo" "Gentoo" "Chinstrap" "Gentoo"
[7] "Adelie" "Adelie" "Adelie" "Gentoo" "Gentoo" "Adelie"
[13] "Chinstrap" "Adelie" "Gentoo" "Chinstrap" "Gentoo" "Gentoo"
[19] "Chinstrap" "Adelie" "Adelie" "Chinstrap" "Adelie" "Gentoo"
[25] "Adelie" "Chinstrap" "Gentoo" "Adelie" "Adelie" "Chinstrap"
[31] "Gentoo" "Gentoo" "Adelie" "Chinstrap" "Gentoo" "Gentoo"
[37] "Adelie" "Gentoo" "Gentoo" "Adelie" "Adelie" "Chinstrap"
[43] "Gentoo" "Adelie" "Gentoo" "Gentoo" "Gentoo" "Chinstrap"
[49] "Adelie" "Adelie" "Gentoo" "Chinstrap" "Chinstrap" "Gentoo"
[55] "Chinstrap" "Chinstrap" "Adelie" "Adelie" "Adelie" "Chinstrap"
[61] "Adelie" "Gentoo" "Adelie" "Adelie" "Adelie" "Adelie"
[67] "Gentoo" "Chinstrap" "Gentoo" "Adelie" "Adelie" "Adelie"
[73] "Chinstrap" "Adelie" "Gentoo" "Chinstrap" "Adelie" "Gentoo"
[79] "Adelie" "Gentoo" "Gentoo" "Gentoo" "Adelie" "Adelie"
[85] "Adelie" "Chinstrap" "Adelie" "Chinstrap" "Gentoo" "Gentoo"
[91] "Adelie" "Gentoo" "Chinstrap" "Adelie" "Adelie" "Gentoo"
[97] "Adelie" "Adelie" "Adelie" "Chinstrap" "Gentoo" "Adelie"
[103] "Adelie" "Gentoo" "Chinstrap" "Gentoo" "Chinstrap" "Chinstrap"
[109] "Adelie" "Adelie" "Gentoo" "Gentoo" "Gentoo" "Gentoo"
[115] "Gentoo" "Gentoo" "Adelie" "Gentoo" "Adelie" "Gentoo"
[121] "Adelie" "Adelie" "Chinstrap" "Gentoo" "Gentoo" "Adelie"
[127] "Chinstrap" "Gentoo" "Gentoo" "Chinstrap" "Chinstrap" "Gentoo"
[133] "Adelie" "Chinstrap" "Chinstrap" "Chinstrap" "Adelie" "Adelie"
[139] "Adelie" "Chinstrap" "Adelie" "Gentoo" "Adelie" "Adelie"
[145] "Gentoo" "Adelie" "Chinstrap" "Chinstrap" "Adelie" "Gentoo"
[151] "Adelie" "Gentoo" "Gentoo" "Gentoo" "Gentoo" "Gentoo"
[157] "Gentoo" "Gentoo" "Adelie" "Chinstrap" "Gentoo" "Adelie"
[163] "Adelie" "Gentoo" "Adelie" "Gentoo" "Adelie" "Adelie"
[169] "Adelie" "Gentoo" "Adelie" "Gentoo" "Adelie" "Adelie"
[175] "Adelie" "Gentoo" "Adelie" "Adelie" "Gentoo" "Adelie"
[181] "Gentoo" "Chinstrap" "Gentoo" "Gentoo" "Gentoo" "Adelie"
[187] "Gentoo" "Gentoo" "Adelie" "Gentoo" "Gentoo" "Gentoo"
[193] "Adelie" "Gentoo" "Gentoo" "Adelie" "Adelie" "Chinstrap"
[199] "Adelie" "Adelie" "Adelie" "Adelie" "Adelie" "Adelie"
[205] "Adelie" "Gentoo" "Gentoo" "Chinstrap" "Chinstrap" "Adelie"
[211] "Adelie" "Adelie" "Gentoo" "Chinstrap" "Chinstrap" "Adelie"
[217] "Gentoo" "Adelie" "Adelie" "Adelie" "Chinstrap" "Gentoo"
[223] "Adelie" "Gentoo" "Adelie" "Gentoo" "Adelie" "Chinstrap"
[229] "Adelie" "Chinstrap" "Adelie" "Adelie" "Gentoo" "Chinstrap"
[235] "Adelie" "Adelie" "Adelie" "Adelie" "Adelie" "Gentoo"
[241] "Chinstrap" "Chinstrap" "Gentoo" "Chinstrap" "Gentoo" "Adelie"
[247] "Chinstrap" "Gentoo" "Gentoo" "Gentoo" "Chinstrap" "Chinstrap"
[253] "Gentoo" "Gentoo" "Adelie" "Gentoo" "Gentoo" "Gentoo"
[259] "Chinstrap" "Chinstrap" "Adelie" "Adelie" "Chinstrap" "Chinstrap"
[265] "Adelie" "Gentoo"
teste1 <- teste |> select(-species)
teste2 <- teste$species
teste2 [1] "Chinstrap" "Adelie" "Adelie" "Adelie" "Adelie" "Chinstrap"
[7] "Adelie" "Adelie" "Adelie" "Adelie" "Adelie" "Gentoo"
[13] "Gentoo" "Adelie" "Adelie" "Gentoo" "Adelie" "Chinstrap"
[19] "Adelie" "Adelie" "Gentoo" "Adelie" "Chinstrap" "Gentoo"
[25] "Chinstrap" "Adelie" "Gentoo" "Adelie" "Adelie" "Adelie"
[31] "Gentoo" "Gentoo" "Gentoo" "Adelie" "Adelie" "Adelie"
[37] "Chinstrap" "Chinstrap" "Gentoo" "Gentoo" "Gentoo" "Gentoo"
[43] "Chinstrap" "Adelie" "Chinstrap" "Adelie" "Gentoo" "Chinstrap"
[49] "Gentoo" "Adelie" "Gentoo" "Adelie" "Chinstrap" "Adelie"
[55] "Adelie" "Adelie" "Gentoo" "Gentoo" "Gentoo" "Gentoo"
[61] "Adelie" "Adelie" "Chinstrap" "Gentoo" "Adelie" "Adelie"
[67] "Adelie"
teste1 bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
310 0.97047524 1.38893250 0.145053302 -0.19504965
16 -0.34611585 0.98268347 -0.425732512 -0.25714480
76 -0.52897572 0.22096653 -1.353259460 -1.25066728
30 -0.63869165 0.37330992 -0.996518326 -1.25066728
97 -1.05926936 0.47487218 -1.139214780 -0.31923996
300 0.53161154 -0.28684476 -0.639777193 -1.87161883
80 -0.80326553 0.83034008 -0.782473646 0.48799706
127 -0.78497955 0.37330992 -0.568428966 0.05333097
116 -0.80326553 0.27174766 -1.067866553 -0.87809635
12 -0.82155152 -0.23606363 -1.638652367 -1.18857213
26 -1.38841713 -0.08372024 -0.425732512 -1.09542939
252 -0.56554770 -1.75949750 0.929883796 0.55009221
169 1.88477460 -0.74387492 2.142803651 1.79199531
134 -1.15069929 -0.59153153 -1.281911233 -1.40590517
53 -1.42498910 0.01784202 -0.996518326 -1.31276244
217 1.18990709 -0.64231266 1.714714291 1.48151954
144 -1.24212923 0.47487218 -1.638652367 -0.38133511
328 1.33619498 1.03346460 -0.568428966 -0.69181089
146 -0.69354961 -0.03293911 -0.568428966 -1.00228666
35 -1.29698719 0.72877782 -0.853821873 -0.87809635
155 0.62304148 -1.30246733 0.787187343 0.64323495
91 -1.46156108 0.67799669 -1.067866553 -1.37485759
319 1.24476505 0.67799669 0.002356848 0.30171159
178 1.33619498 -1.50559185 1.215276703 1.35732923
280 1.37276696 0.77955895 -0.996518326 -1.18857213
32 -0.91298146 0.77955895 -1.139214780 -0.69181089
205 1.72020072 -0.69309379 1.286624930 1.60570985
14 -1.22384324 1.69361927 -0.140339605 -0.53657300
17 -1.73585089 0.47487218 -0.996518326 -1.62323821
133 -0.78497955 0.62721557 -0.782473646 -0.38133511
193 -0.21811394 -1.50559185 0.573142662 0.61218737
216 1.18990709 -0.99778056 1.072580250 0.98475830
199 2.17735040 -0.08372024 1.928758971 1.72990016
90 -1.00441139 0.37330992 -0.782473646 -1.09542939
20 -1.71756490 1.99830605 -0.211687832 0.23961644
2 -1.71756490 0.01784202 -0.853821873 -1.25066728
320 1.59219881 1.33815137 -0.283036059 -0.59866815
333 0.91561728 1.18580798 0.644490889 -0.31923996
168 1.37276696 -0.43918814 2.071455424 1.60570985
153 1.02533320 -1.09934282 1.072580250 0.67428252
224 0.69618543 -1.09934282 1.001232023 1.79199531
148 1.08019116 -0.54075040 0.858535569 1.48151954
276 -0.27297190 0.06862315 -0.996518326 -1.06438182
124 -1.07755534 0.22096653 -0.996518326 -0.97123908
311 -0.29125789 0.06862315 -1.424607687 -0.75390604
25 -0.14496999 0.93190234 -0.283036059 0.70533010
197 1.24476505 0.06862315 1.928758971 1.72990016
285 0.91561728 1.23658911 0.787187343 0.11542613
157 0.44018160 -0.79465604 1.429321384 0.98475830
9 -0.85812350 1.74440040 -0.782473646 -0.69181089
149 1.06190517 -0.18528250 2.071455424 1.85409047
108 -0.67526362 0.42409105 -0.425732512 -1.18857213
292 1.46419690 0.47487218 0.002356848 -0.19504965
58 -0.58383369 0.62721557 -0.425732512 -0.38133511
10 -0.82155152 0.32252879 -0.925170100 -1.12647697
138 -0.93126744 0.83034008 -0.782473646 -0.75390604
184 0.07446186 0.06862315 1.286624930 1.29523407
201 0.18417778 -0.89621830 1.357973157 1.04685345
171 0.40360963 -1.15012395 1.429321384 1.35732923
151 0.22074976 -1.70871637 1.001232023 0.67428252
7 -1.16898528 -0.08372024 -1.139214780 -0.75390604
126 -1.11412732 0.72877782 -0.568428966 -1.59219063
305 0.31217969 -0.08372024 -0.425732512 -0.69181089
163 1.02533320 -0.59153153 1.714714291 1.85409047
40 -0.78497955 0.27174766 -0.568428966 -1.25066728
92 -0.52897572 0.93190234 -1.353259460 -0.97123908
72 -0.78497955 0.88112121 -1.210563007 -0.81600120
6 Construindo os Modelos
Vamos realizar vários teste com K diferentes, para determinarmos qual melhor defini e separa nosso dados.
Começamos com o K=2, para poder separar as espécies.
modelo <- knn(train = treino1,
test = teste1,
cl = treino2,
k = 2)Nesse estou definindo os levels, pois, assim conseguirei ter um melhor resultado, sendo necessário a utilização desse código.
levels(modelo)[1] "Adelie" "Chinstrap" "Gentoo"
levels(teste2)NULL
Aqui eu já atribuo os valores antes determinados, pois, nosso modelo só aceita variáveis do tipo número, e no nosso caso, espécie é uma stringr, então agora estou voltando os valores ao normal.
modelo1 <- factor(modelo, levels = unique(c(levels(modelo), levels(teste2))))
teste2 <- factor(teste2, levels = unique(c(levels(modelo), levels(teste2))))Nesse código já realizo uma verificação dos resultado e já realizo o comparativo.
matriz_confusao<-confusionMatrix(modelo1, teste2)
print(matriz_confusao)Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 34 1 0
Chinstrap 0 11 0
Gentoo 0 0 21
Overall Statistics
Accuracy : 0.9851
95% CI : (0.9196, 0.9996)
No Information Rate : 0.5075
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9754
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 1.0000 0.9167 1.0000
Specificity 0.9697 1.0000 1.0000
Pos Pred Value 0.9714 1.0000 1.0000
Neg Pred Value 1.0000 0.9821 1.0000
Prevalence 0.5075 0.1791 0.3134
Detection Rate 0.5075 0.1642 0.3134
Detection Prevalence 0.5224 0.1642 0.3134
Balanced Accuracy 0.9848 0.9583 1.0000
modelo2 <- knn(train = treino1,
test = teste1,
cl = treino2,
k = 3)modelo2 <- factor(modelo2, levels = unique(c(levels(modelo), levels(teste2))))
teste2 <- factor(teste2, levels = unique(c(levels(modelo), levels(teste2))))matriz_confusao<-confusionMatrix(modelo2, teste2)
print(matriz_confusao)Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 34 1 0
Chinstrap 0 11 0
Gentoo 0 0 21
Overall Statistics
Accuracy : 0.9851
95% CI : (0.9196, 0.9996)
No Information Rate : 0.5075
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9754
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 1.0000 0.9167 1.0000
Specificity 0.9697 1.0000 1.0000
Pos Pred Value 0.9714 1.0000 1.0000
Neg Pred Value 1.0000 0.9821 1.0000
Prevalence 0.5075 0.1791 0.3134
Detection Rate 0.5075 0.1642 0.3134
Detection Prevalence 0.5224 0.1642 0.3134
Balanced Accuracy 0.9848 0.9583 1.0000
modelo3 <- knn(train = treino1,
test = teste1,
cl = treino2,
k = 4)modelo3 <- factor(modelo3, levels = unique(c(levels(modelo), levels(teste2))))
teste2 <- factor(teste2, levels = unique(c(levels(modelo), levels(teste2))))matriz_confusao<-confusionMatrix(modelo3, teste2)
print(matriz_confusao)Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 34 1 0
Chinstrap 0 11 0
Gentoo 0 0 21
Overall Statistics
Accuracy : 0.9851
95% CI : (0.9196, 0.9996)
No Information Rate : 0.5075
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9754
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 1.0000 0.9167 1.0000
Specificity 0.9697 1.0000 1.0000
Pos Pred Value 0.9714 1.0000 1.0000
Neg Pred Value 1.0000 0.9821 1.0000
Prevalence 0.5075 0.1791 0.3134
Detection Rate 0.5075 0.1642 0.3134
Detection Prevalence 0.5224 0.1642 0.3134
Balanced Accuracy 0.9848 0.9583 1.0000
modelo4 <- knn(train = treino1,
test = teste1,
cl = treino2,
k = 5)modelo4 <- factor(modelo4, levels = unique(c(levels(modelo), levels(teste2))))
teste2 <- factor(teste2, levels = unique(c(levels(modelo), levels(teste2))))matriz_confusao<-confusionMatrix(modelo4, teste2)
print(matriz_confusao)Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 34 2 0
Chinstrap 0 10 0
Gentoo 0 0 21
Overall Statistics
Accuracy : 0.9701
95% CI : (0.8963, 0.9964)
No Information Rate : 0.5075
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.9504
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 1.0000 0.8333 1.0000
Specificity 0.9394 1.0000 1.0000
Pos Pred Value 0.9444 1.0000 1.0000
Neg Pred Value 1.0000 0.9649 1.0000
Prevalence 0.5075 0.1791 0.3134
Detection Rate 0.5075 0.1493 0.3134
Detection Prevalence 0.5373 0.1493 0.3134
Balanced Accuracy 0.9697 0.9167 1.0000
ControleKNN <- trainControl(method = "cv", number = 10)
Crossvalidation <- train(species ~., data = treino, method = "knn", trControl = ControleKNN)
Crossvalidation$results k Accuracy Kappa AccuracySD KappaSD
1 5 0.9887464 0.9823528 0.01812410 0.02844670
2 7 0.9924501 0.9880132 0.01592004 0.02529019
3 9 0.9850427 0.9765712 0.01931412 0.03027790
7 Conclusão do KNN
Podemos observar que o K=3 e K=4, nos trouxe uma Acurácia de 98%, podemos optar por ambos na hora de avaliarmos qual pinguin com base nas variáveis coletadas, mas, um K=2, já nos retornar uma eficiência acima de 95%, o que já é um excelente resultado para os dados que estamos trabalhando, não sendo necessários, outros teste, pois, estatisticamente, essa acurácia do K=2, já poderá satisfazer o modelo. Além de processualmente é melhor.
8 Analisando os dados por outras modelagens
Agora que já vimos um pouco do modelo KNN, e verificamos a sua classificação. Vamos utilizar outros modelos e com isso decidir qual deles melhor classificaria os nossos dados.
9 Construindo o modelo de Floresta Aleatória
Com base nos dados já normalizados anteriormente, devido ao modelo KNN, utilizaremos os dados para a criação do modelos a seguir.
treino <- Dadosnormalizados[1:n,]
teste <- Dadosnormalizados[-(1:n),]treino <- Dadosnormalizados[1:n, ]
teste <- Dadosnormalizados[-(1:n), ]
treino1 <- treino |> select(-species)
treino2 <- treino$species
teste1 <- teste |> select(-species)
teste2 <- teste$species#Ávore de decisão
arvore.dados <- rpart(formula = species ~., data = treino, method = "class")
rpart.plot(arvore.dados, extra = 101)Optei por exemplificar a árvore de decisão para da uma visão de como seria uma parte da floresta.
previsao.arvore <- predict(arvore.dados, newdata = teste, type = "class")
mean(previsao.arvore == teste$species)[1] 0.9253731
tabela.previsao.arvore <- table(previsao.arvore, teste$species) # matriz de confusão
tabela.previsao.arvore
previsao.arvore Adelie Chinstrap Gentoo
Adelie 33 2 0
Chinstrap 1 8 0
Gentoo 0 2 21
Como podemos perceber tivemos uma acuaria de 92%, é um valor considerável, para a árvore.
#Floresta aleatória
Como a floresta trabalha de forma binária, tivemos que transformar os variável Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Gentoo, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, Chinstrap, desta forma conseguimos melhor classificar os dados no modelo.
Construindo o modelo:
treino$species <- as.factor(treino$species)
floresta.dados <- randomForest(species ~., data = treino)
floresta.dados
Call:
randomForest(formula = species ~ ., data = treino)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 2
OOB estimate of error rate: 3.01%
Confusion matrix:
Adelie Chinstrap Gentoo class.error
Adelie 109 2 1 0.02678571
Chinstrap 4 52 0 0.07142857
Gentoo 0 1 97 0.01020408
Tivemos uma estimativa de erro próximo a 2,63% em 500 ávores do modelo. O que nos de uma acurácia de 97%, demosntrando uma eficiência no processamento dos dados e uma boa separação, o que se repete quando utlizamos o CROSS-VALIDATION.
previsao.floresta <- predict(floresta.dados, newdata = teste, type = "class")
Floresta<-mean(previsao.floresta == teste$species)tabela.previsao.floresta <- table(previsao.floresta, teste$species) # matriz de confusão
tabela.previsao.floresta
previsao.floresta Adelie Chinstrap Gentoo
Adelie 34 2 0
Chinstrap 0 10 0
Gentoo 0 0 21
ControleFloresta <- trainControl(method = "cv", number = 10)
Crossvalidation <- train(species ~., data = treino, method = "rf", trControl = ControleFloresta)
Crossvalidation$results mtry Accuracy Kappa AccuracySD KappaSD
1 2 0.9735043 0.9588815 0.02575683 0.03943650
2 3 0.9621083 0.9415014 0.03593836 0.05393143
3 4 0.9622507 0.9417267 0.03995523 0.06055236
Observasse que as acurácias ficam entorno de 97%.
10 Modelo SVM (Support Vector Machine)
Dadosnormalizados$species <- as.factor(Dadosnormalizados$species)
prop.table(table(Dadosnormalizados$species))
Adelie Chinstrap Gentoo
0.4384384 0.2042042 0.3573574
Convertemos a matriz em um data frame, e os dados das colunas de interesse para numérico, pois, os valores no dataframe estava como caratere, fazendo com que o modelo não respondesse.
conjunto <- as.data.frame(as.matrix(Dadosnormalizados))
conjunto$bill_length_mm <- as.numeric(conjunto$bill_length_mm)
conjunto$bill_depth_mm <- as.numeric(conjunto$bill_depth_mm)
conjunto$flipper_length_mm <- as.numeric(conjunto$flipper_length_mm)
conjunto$body_mass_g <- as.numeric(conjunto$body_mass_g)
indices <- sample(1:nrow(conjunto), size = n, replace = FALSE)
conjunto$species <- Dadosnormalizados$species
treino <- conjunto[indices,]
teste <- conjunto[-indices,]Separando o teino do teste.
treino$species <- as.factor(treino$species)
teste$species <- as.factor(teste$species)###Construindo o Modelo SVM
modelagem<- svm(formula = species~., data = treino)
previsao <- predict(modelagem, newdata = teste, type = "class")
table(previsao, teste$species)
previsao Adelie Chinstrap Gentoo
Adelie 28 1 0
Chinstrap 1 13 0
Gentoo 0 0 24
mean(previsao == teste$species)[1] 0.9701493
11 Observação Final
Enquanto a Floresta Aleatória obteve performance ligeiramente superior no Palmerpenguins (97.4% vs 98% do KNN), o SVM mostrou melhor equilíbrio entre acurácia e eficiência computacional mantendo uma acurácia de 97%. O que pode ser uma boa solução para este tipo de dados, onde reduziremos o processamento e garatiremos uma eficiência quanto a resultado.