Como criar florestas aleatórias em r (passo a passo)


Quando a relação entre um conjunto de variáveis preditoras e uma variável de resposta é muito complexa, frequentemente usamos métodos não lineares para modelar a relação entre elas.

Um desses métodos é construir uma árvore de decisão . No entanto, a desvantagem de usar uma única árvore de decisão é que ela tende a sofrer de alta variância .

Ou seja, se dividirmos o conjunto de dados em duas metades e aplicarmos a árvore de decisão a ambas as metades, os resultados poderão ser muito diferentes.

Um método que podemos usar para reduzir a variância de uma única árvore de decisão é construir um modelo de floresta aleatório , que funciona da seguinte forma:

1. Pegue b amostras inicializadas do conjunto de dados original.

2. Crie uma árvore de decisão para cada amostra de bootstrap.

  • Ao construir a árvore, cada vez que uma divisão é considerada, apenas uma amostra aleatória de m preditores é considerada candidata à divisão do conjunto completo de p preditores. Geralmente, escolhemos m igual a √p .

3. Calcule a média das previsões de cada árvore para obter um modelo final.

Acontece que florestas aleatórias tendem a produzir modelos muito mais precisos do que árvores de decisão única e até mesmo modelos empacotados .

Este tutorial fornece um exemplo passo a passo de como criar um modelo de floresta aleatório para um conjunto de dados em R.

Passo 1: Carregue os pacotes necessários

Primeiro, carregaremos os pacotes necessários para este exemplo. Para este exemplo simples, precisamos apenas de um pacote:

 library (randomForest)

Etapa 2: ajustar o modelo de floresta aleatória

Para este exemplo, usaremos um conjunto de dados R integrado chamado Qualidade do Ar , que contém medições da qualidade do ar na cidade de Nova York durante 153 dias individuais.

 #view structure of air quality dataset
str(airquality)

'data.frame': 153 obs. of 6 variables:
 $ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
 $Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
 $Month: int 5 5 5 5 5 5 5 5 5 5 ...
 $Day: int 1 2 3 4 5 6 7 8 9 10 ...

#find number of rows with missing values
sum(! complete . cases (airquality))

[1] 42

Este conjunto de dados possui 42 linhas com valores ausentes. Portanto, antes de ajustar um modelo de floresta aleatório, preencheremos os valores faltantes em cada coluna com as medianas das colunas:

 #replace NAs with column medians
for (i in 1: ncol (air quality)) {
  airquality[,i][ is . na (airquality[, i])] <- median (airquality[, i], na . rm = TRUE )
}

Relacionado: Como imputar valores ausentes em R

O código a seguir mostra como ajustar um modelo de floresta aleatório em R usando a função randomForest() do pacote randomForest .

 #make this example reproducible
set.seed(1)

#fit the random forest model
model <- randomForest(
  formula = Ozone ~ .,
  data = airquality
)

#display fitted model
model

Call:
 randomForest(formula = Ozone ~ ., data = airquality) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 327.0914
                    % Var explained: 61

#find number of trees that produce lowest test MSE
which.min(model$mse)

[1] 82

#find RMSE of best model
sqrt(model$mse[ which . min (model$mse)]) 

[1] 17.64392

Pelo resultado, podemos perceber que o modelo que produziu o menor erro quadrático médio (MSE) de teste utilizou 82 árvores.

Também podemos ver que a raiz do erro quadrático médio deste modelo foi 17,64392 . Podemos pensar nisso como a diferença média entre o valor previsto para o ozônio e o valor real observado.

Também podemos usar o código a seguir para produzir um gráfico do teste MSE com base no número de árvores usadas:

 #plot the MSE test by number of trees
plot(model)

Teste MSE pelo número de árvores em uma floresta aleatória em R

E podemos usar a função varImpPlot() para criar um gráfico que exibe a importância de cada variável preditora no modelo final:

 #produce variable importance plot
varImpPlot(model) 

Floresta aleatória em R

O eixo x exibe o aumento médio na pureza dos nós das árvores de regressão como uma função da divisão entre os diferentes preditores exibidos no eixo y.

No gráfico, podemos ver que Vento é a variável preditora mais importante, seguida de perto por Temp .

Etapa 3: ajuste o modelo

Por padrão, a função randomForest() usa 500 árvores e (total de preditores/3) preditores selecionados aleatoriamente como candidatos potenciais para cada divisão. Podemos ajustar esses parâmetros usando a função tuneRF() .

O código a seguir mostra como encontrar o modelo ideal usando as seguintes especificações:

  • ntreeTry: O número de árvores a serem construídas.
  • mtryStart: o número inicial de variáveis preditoras a serem consideradas em cada divisão.
  • stepFactor: Fator para aumentar até que o erro fora da sacola estimado pare de melhorar em um determinado valor.
  • melhorar: a quantidade pela qual o erro de saída da bolsa deve ser melhorado para continuar aumentando o fator de passo.
 model_tuned <- tuneRF(
               x=airquality[,-1], #define predictor variables
               y=airquality$Ozone, #define response variable
               ntreeTry= 500 ,
               mtryStart= 4 , 
               stepFactor= 1.5 ,
               improve= 0.01 ,
               trace= FALSE #don't show real-time progress
               )

Esta função produz o gráfico a seguir, que exibe o número de preditores usados em cada divisão ao construir as árvores no eixo x e o erro fora do saco estimado no eixo y:

Erro OOB do modelo de floresta aleatório em R

Podemos ver que o menor erro OOB é obtido usando 2 preditores escolhidos aleatoriamente em cada divisão ao construir as árvores.

Na verdade, isso corresponde à configuração padrão (total de preditores/3 = 6/3 = 2) usada pela função randomForest() inicial.

Etapa 4: use o modelo final para fazer previsões

Finalmente, podemos usar o modelo de floresta aleatória ajustado para fazer previsões sobre novas observações.

 #define new observation
new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5)

#use fitted bagged model to predict Ozone value of new observation
predict(model, newdata=new)

27.19442

Com base nos valores das variáveis preditoras, o modelo de floresta aleatória ajustado prevê que o valor do ozônio será 27,19442 neste dia específico.

O código R completo usado neste exemplo pode ser encontrado aqui .

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *