|
| 1 | +```{=html} |
| 2 | +<style> |
| 3 | +.red-text { |
| 4 | + color: red; |
| 5 | +} |
| 6 | +.blue-text { |
| 7 | + color: blue; |
| 8 | +} |
| 9 | +</style> |
| 10 | +``` |
| 11 | + |
1 | 12 | # Métodos de Treino Baseados em Árvore
|
2 | 13 |
|
3 | 14 | Neste capítulo será estudado de forma mais aprofundada modelos de treinamento baseados em árvores, os quais são simples para interpretação, como: árvores de decisão e regressão, florestas aleatórias, adaboost, entre outros. O objetivo é entender o funcionamento dos mesmos, assim como os critérios que utilizam para classificarem as amostras.
|
@@ -227,23 +238,135 @@ O ganho ao aumentar a árvore pode ser resumido como um conjunto de atributos pr
|
227 | 238 |
|
228 | 239 | Agora iremos discutir o processo de construção de uma árvore de regressão. Em uma árvore de regressão, diferentemente de uma árvore para classificação, cada folha possui um valor numérico (ao invés de categorias como "Sim" ou "Não", como no exemplo anterior da base SmallHeart). Vejamos a seguir um exemplo de árvore de decisão para um problema de regressão.
|
229 | 240 |
|
230 |
| - |
231 |
| - |
| 241 | +{fig-align="center"} |
232 | 242 |
|
233 | 243 | Esse valor numérico presente nas folhas não é nada menos que a média do valor da variável de interesse a ser prevista para os elementos que satisfazem a condição do nó. Por exemplo, na árvore de regressão acima a primeira folha dá como resultado uma eficácia de 5%: essa foi a média observada da eficácia do medicamento em pacientes com mais de 50 anos de idade. Para a segunda folha, a com eficácia de 20%: esse valor é a média da eficácia do medicamento em um indivíduo com menos de 50 anos de idade e que toma uma dosagem maior do que 29mg foi de 20%. O processo é o mesmo para as outras folhas.
|
234 | 244 |
|
235 | 245 | A grande pergunta é qual valor colocar no nó como condição. Para exemplificar como funciona o processo, vamos começar com um exemplo simples:
|
236 | 246 |
|
237 |
| -**Ex.:** Vamos carregar o banco de dados “SmallAdvertising”. Este banco possui informações sobre as vendas de um produto em 10 mercados diferentes (variável sales), além de orçamentos de publicidade para esse produto em cada um dos mercados para três mídias diferentes: TV, rádio e jornal (variáveis TV, radio e newspaper, respectivamente). |
238 |
| - |
239 |
| - |
| 247 | +**Ex.:** Vamos carregar o banco de dados "SmallAdvertising". Este banco possui informações sobre as vendas de um produto em 10 mercados diferentes (variável sales), além de orçamentos de publicidade para esse produto em cada um dos mercados para três mídias diferentes: TV, rádio e jornal (variáveis TV, radio e newspaper, respectivamente). |
240 | 248 |
|
241 | 249 | ```{r}
|
242 | 250 | vendas = readRDS("SmallAdvertising.rds")
|
243 | 251 |
|
244 | 252 | vendas
|
245 | 253 | ```
|
246 | 254 |
|
| 255 | +Vamos considerar o caso em que queremos construir uma árvore de regressão para prever as vendas baseados apenas na variável TV. |
| 256 | + |
| 257 | +```{r} |
| 258 | +plot(vendas$TV, vendas$sales, pch = 19, |
| 259 | + xlab = "Orçamento de Publicidade do Produto para a TV", |
| 260 | + ylab = "Vendas do Produto", |
| 261 | + main = "Vendas do produto x Publicidade para a TV") |
| 262 | +``` |
| 263 | + |
| 264 | +Primeiramente é preciso definir qual valor irá entrar como condição no primeiro nó. O algoritmo realiza isso testando todos os possíveis valores de separação para os dados, e pega o que minimiza a soma dos quadrados dos resíduos. Inicialmente, como o primeiro separador, ele considera a média dos 2 menores valores da Publicidade. |
| 265 | + |
| 266 | +```{r} |
| 267 | +ordenados = sort(vendas$TV) |
| 268 | +mean(ordenados[1:2]) |
| 269 | +``` |
| 270 | + |
| 271 | +Então 44,95 é o primeiro valor a ser testado para a separação dos dados. |
| 272 | + |
| 273 | +```{r} |
| 274 | +plot(vendas$TV, vendas$sales, pch = 19, |
| 275 | + xlab = "Orçamento de Publicidade do Produto para a TV", |
| 276 | + ylab = "Vendas do Produto", |
| 277 | + main = "Vendas do produto x Publicidade para a TV"); abline(v = 44.95, |
| 278 | + col = "red") |
| 279 | +``` |
| 280 | + |
| 281 | +Assim, o primeiro nó será da seguinte forma: |
| 282 | + |
| 283 | +{fig-align="center"} |
| 284 | + |
| 285 | +Para a resposta "sim" prevemos que as vendas do produto será de 9,2, o qual é o resultado da média dos valores das vendas para todos os produtos cuja publicidade foi menor do que 44,95 (ou seja, é apenas o valor do primeiro elemento). Para a resposta "Não", então a folha seguinte contém o resultado da média dos valores das vendas para todos os produtos cuja publicidade foi maior do que 44,95, o qual é de 15,05. |
| 286 | + |
| 287 | +Note que fazendo isso teremos resíduos (diferença do valor original e do valor predito pela árvore) muito grandes. O algoritmo eleva esses resíduos ao quadrado e os soma. Esse valor é a soma dos quadrados dos resíduos considerando o nó "Publicidade para a TV \< 44,95?". |
| 288 | + |
| 289 | +Em seguida ele irá para o próximo separador: a média do segundo e do terceiro menores pontos. |
| 290 | + |
| 291 | +```{r} |
| 292 | +mean(ordenados[2:3]) |
| 293 | +``` |
| 294 | + |
| 295 | +Então 66,95 é o segundo valor a ser testado para a separação dos dados. |
| 296 | + |
| 297 | +```{r} |
| 298 | +plot(vendas$TV, vendas$sales, pch = 19, |
| 299 | + xlab = "Orçamento de Publicidade do Produto para a TV", |
| 300 | + ylab = "Vendas do Produto", |
| 301 | + main = "Vendas do produto x Publicidade para a TV"); abline(v = 66.95, |
| 302 | + col = "red") |
| 303 | +``` |
| 304 | + |
| 305 | +Então o nó considerado será da forma "Publicidade para a TV \< 66,95?". |
| 306 | + |
| 307 | +{fig-align="center"} |
| 308 | + |
| 309 | + |
| 310 | +O valor de 8,9 corresponde ao resultado da média dos valores das vendas para todos os produtos cuja publicidade foi menor do que 66,95. Então a árvore prevê esse valor de vendas para o produto que obteve uma publicidade para a TV < 66,95. O valor de 15,77 é o resultado da média dos valores das vendas para todos os produtos cuja publicidade foi maior do que 66,95. Novamente serão obtidos os resíduos dessa predição e eles serão somados. |
| 311 | + |
| 312 | +Então o algoritmo irá para o próximo separador e irá calcular a soma dos quadrados dos resíduos da predição. Isso ocorre sucessivamente até acabarem todos os separadores possíveis para a árvore. O separador vencedor (aquele que irá para o nó raiz) é aquele com a menor soma dos quadrados dos resíduos. |
| 313 | + |
| 314 | +A construção dos próximos nós se dá pela mesma forma que a do nó raiz. O processo de construção da árvore termina quando: |
| 315 | + |
| 316 | + |
| 317 | +- Atingimos um número mínimo de observações em uma folha (usualmente é utilizado 20 observações). Não continuamos a divisão após esse número mínimo pois corremos o risco de criar uma árvore sobreajustada à amostra dada; |
| 318 | + |
| 319 | +- Quando o ganho ao aumentar a árvore é muito pequeno. |
| 320 | + |
| 321 | + |
| 322 | +Agora vamos para o caso em que tenhamos mais de uma variável preditiva nos dados. Vamos considerar agora que queremos prever as vendas do produto baseado em seus orçamentos de publicidade para TV, rádio e jornal. |
| 323 | + |
| 324 | +Assim como anteriormente, começamos usando o orçamento para a TV para prever as vendas, e pegamos o separador com a menor soma dos quadrados dos resíduos. O melhor separador se torna um candidato para a raiz da árvore. Em seguida, focamos em utilizar o orçamento para o rádio para prever as vendas. Assim como com o orçamento para a TV, tentamos diferentes separadores para a predição e calculamos a soma dos quadrados dos resíduos em cada passo. O melhor separador se torna outro candidato para a raiz. Por último, utilizamos o orçamento para o jornal para prever as vendas, e após tentarmos diferentes separadores pegamos aquele com a menor soma dos quadrados dos resíduos também. Então comparamos a soma dos quadrados dos resíduos de todos os candidatos para a raiz, e o escolhido, novamente, é aquele com a menor soma. |
| 325 | + |
| 326 | +Para os próximos nós o processo de construção também é equivalente ao anterior, exceto que agora nós comparamos a menor soma dos quadrados dos resíduos de cada preditor. E, novamente, quando uma folha atinge um número mínimo de observações, a árvore é finalizada. |
| 327 | + |
| 328 | + |
| 329 | + |
| 330 | +### Construindo árvores com o [rpart]{.red-text} e [rpart.plot]{.red-text} |
| 331 | + |
| 332 | + |
| 333 | +Vamos construir árvores com o comando rpart(). Como argumento da função nós passamos: |
| 334 | + |
| 335 | + |
| 336 | +- A variável de interesse a ser prevista em função das variáveis preditoras; |
| 337 | +- A base de dados onde as variáveis se encontram. |
| 338 | + |
| 339 | + |
| 340 | +Vamos utilizar a base de dados referentes ao primeiro exemplo dado de construção de uma árvore, onde queríamos prever se um indivíduo possui doença cardíaca baseado em características dele. |
| 341 | + |
| 342 | + |
| 343 | +```{r} |
| 344 | +library(rpart) |
| 345 | +heart_arvore = rpart(HeartDisease~., data = base) |
| 346 | +``` |
| 347 | + |
| 348 | + |
| 349 | +Agora vamos plotar a árvore com o comando rpart.plot(). |
| 350 | + |
| 351 | + |
| 352 | + |
| 353 | +```{r} |
| 354 | +library(rpart.plot) |
| 355 | +rpart.plot(heart_arvore) |
| 356 | +``` |
| 357 | + |
| 358 | + |
| 359 | +Observe que a árvore ficou “vazia”. O que ela quer dizer com isso é: assuma “Não” sempre para o indivíduo possuir doença cardíaca, e acerte com precisão de 78%. Isso ocorre devido aos valores iniciais do comando rpart.control(), que ajusta os parâmetros da função rpart(). Os principais parâmetros do rpart.control são: |
| 360 | + |
| 361 | + |
| 362 | +- minsplit: o número mínimo de observações que devem existir em um nó para que uma divisão seja tentada. Padrão: minsplit = 20; |
| 363 | + |
| 364 | +- minbucket: o número mínimo de observações em qualquer folha. Padrão: minbucket = minsplit/3; |
| 365 | + |
| 366 | +- cp (complexity parameter): o mínimo de ganho de ajuste que devemos ter em cada divisão. O principal papel desse parâmetro é economizar tempo de computação removendo as divisões que não valem a pena. Padrão: cp = 0,01; |
| 367 | + |
| 368 | +- maxdepth: profundidade máxima da árvore (a profundidade da raiz é zero). Não pode ser maior que 30. |
| 369 | + |
247 | 370 |
|
248 | 371 |
|
249 | 372 |
|
|
0 commit comments