Regressão com Random Forest e Seleção de atributos

Nesse post utilizaremos o algoritmo de machine learning para regressão, o Random Forest (Floresta Aleatória) em conjunto com o a técnica de seleção de atributos para potencializar o desempenho do nosso modelo. As vantagens de se usar o método de seleção de atributos em conjunto com o nosso modelo são: Redução de overfitting, Melhora no desempenho computacional, Simplicidade do modelo e Evitar a multicolinearidade.

🤖Criando o Modelo

1) Importação das bibliotecas e dos dados.
# Importação das bibliotecas
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestRegressor
# importação do dataset
dataset = pd.read_csv('../Data/mt_cars.csv')
dataset.head()

Saída:

    Unnamed: 0	mpg	cyl	disp	hp	drat	wt	qsec	vs	am	gear	carb
0 Mazda RX4	21.0	6	160.0	110	3.90	2.620	16.46	0	1	4	4
1 Mazda RX4 Wag	21.0	6	160.0	110	3.90	2.875	17.02	0	1	4	4
2 Datsun 710	22.8	4	108.0	93	3.85	2.320	18.61	1	1	4	1
3 Hornet 4 Driv 21.4	6	258.0	110	3.08	3.215	19.44	1	0	3	1
4 Hornet Sporta.18.7	8	360.0	175	3.15	3.440	17.02	0	0	3	2

2) Remoção da coluna Unnamed: 0

# Apagando a coluna Unnamed: 0
dataset = dataset.drop('Unnamed: 0', axis=1)
dataset.head()

➜ A coluna não tem valor para o nosso modelo.

Saída:

mpg	cyl	disp	hp	drat	wt	qsec	vs	am	gear	carb
0	21.0	6	160.0	110	3.90	2.620	16.46	0	1	4	4
1	21.0	6	160.0	110	3.90	2.875	17.02	0	1	4	4
2	22.8	4	108.0	93	3.85	2.320	18.61	1	1	4	1
3	21.4	6	258.0	110	3.08	3.215	19.44	1	0	3	1
4	18.7	8	360.0	175	3.15	3.440	17.02	0	0	3	2

3) Criação dos previsores e a classe:

previsores = dataset.iloc[:, 1:11].values
classe = dataset.iloc[:, 0].values

4) Divisão dos dados de treino e teste no modelo hold out:

# Divisão da base de dados entre treinamento e teste (30% para testar e 70% para treinar)
X_treinamento, X_teste, y_treinamento, y_teste = train_test_split(previsores,
                                                                  classe,
                                                                  test_size = 0.3,
                                                                  random_state = 0)

5) Criação e treinamento do modelo:

# Criação do modelo e treinamento
floresta = RandomForestRegressor(n_estimators = 100)
floresta.fit(X_treinamento, y_treinamento)

6) Previsão:

previsoes = floresta.predict(X_teste)
previsoes

Saída:

array([17.401, 18.819, 19.503, 27.217, 13.398, 13.462, 16.791, 25.253,
       23.89 , 17.519])

7) Avaliação:

import numpy as np

# Mean Error (ME)
me = np.mean(y_teste - previsoes)
print(f"Mean Error (ME): {me}")

# Mean Absolute Error (MAE)
mae = np.mean(np.abs(y_teste - previsoes))
print(f"Mean Absolute Error (MAE): {mae}")

# Root Mean Squared Error (RMSE)
rmse = np.sqrt(np.mean((y_teste - previsoes)**2))
print(f"Root Mean Squared Error (RMSE): {rmse}")

# Mean Percentage Error (MPE)
mpe = np.mean((y_teste - previsoes) / y_teste) * 100
print(f"Mean Percentage Error (MPE): {mpe} %")

# Mean Absolute Percentage Error (MAPE)
mape = np.mean(np.abs((y_teste - previsoes) / y_teste)) * 100
print(f"Mean Absolute Percentage Error (MAPE): {mape} %")

Saída:

Mean Error (ME): -1.7453000000000123
Mean Absolute Error (MAE): 2.1551000000000067
Root Mean Squared Error (RMSE): 2.453777883183412
Mean Percentage Error (MPE): -10.921018963874065 %
Mean Absolute Percentage Error (MAPE): 13.267062919917999 %


🔎Seleção de Atributos

from sklearn.ensemble import ExtraTreesRegressor

# Criação do modelo e treinamento da seleção de atributos
sa = ExtraTreesRegressor()
sa.fit(X_treinamento, y_treinamento)
atributos_importantes = sa.feature_importances_
# argsort()[::-1] -> Ordena os índices em ordem decrescente
indices = atributos_importantes.argsort()[::-1]

# Atributos mais importantes em ordem decrescente
for i in indices:
    print(f"{atributos[i]}: {atributos_importantes[i]}")

Saída: 

cyl: 0.33048198027866155
wt: 0.2301653765690489
disp: 0.18768665977519394
hp: 0.09295189937691331
vs: 0.07946530301883103
qsec: 0.023876282271901344
carb: 0.01980143657124836
am: 0.01875984508939095
drat: 0.009896774392093344
gear: 0.006914442656717381

➜ Atributos por ordem decrescente de importância.


🤖Criando um novo Modelo

1) Criação dos previsores:

# Escolher os 5 atributos mais importantes
previsores2 = dataset.iloc[:, [1, 2, 3, 5, 7]].values
previsores2.shape

➜ Os 5 melhores atributos segundo o resultado da seleção de atributos.

2) Divisão dos dados de treino e teste:

# Divisão da base de dados entre treinamento e teste (30% para testar e 70% para treinar)
X_treinamento2, X_teste2, y_treinamento2, y_teste2 = train_test_split(previsores2,
                                                                  classe,
                                                                  test_size = 0.3,
                                                                  random_state = 0)

3) Criação e treinamento do modelo:

# Criação do modelo e treinamento
floresta2 = RandomForestRegressor(n_estimators = 100)
floresta2.fit(X_treinamento2, y_treinamento2)

4) Previsão:

previsoes2 = floresta2.predict(X_teste2)
previsoes2

5) Avaliação:

import numpy as np

# Mean Error (ME)
me = np.mean(y_teste2 - previsoes2)
print(f"Mean Error (ME): {me}")

# Mean Absolute Error (MAE)
mae = np.mean(np.abs(y_teste2 - previsoes2))
print(f"Mean Absolute Error (MAE): {mae}")

# Root Mean Squared Error (RMSE)
rmse = np.sqrt(np.mean((y_teste2 - previsoes2)**2))
print(f"Root Mean Squared Error (RMSE): {rmse}")

# Mean Percentage Error (MPE)
mpe = np.mean((y_teste2 - previsoes2) / y_teste2) * 100
print(f"Mean Percentage Error (MPE): {mpe} %")

# Mean Absolute Percentage Error (MAPE)
mape = np.mean(np.abs((y_teste2 - previsoes2) / y_teste2)) * 100
print(f"Mean Absolute Percentage Error (MAPE): {mape} %")

Saída:

Mean Error (ME): -1.3790000000000082
Mean Absolute Error (MAE): 2.0108000000000046
Root Mean Squared Error (RMSE): 2.4852048205329194
Mean Percentage Error (MPE): -7.860116438138359 %
Mean Absolute Percentage Error (MAPE): 12.113135799729143 %

➜ Os 2 modelos obtiveram performances parecidas!

🤔Qual o modelo escolher?

➜ Com exceção do RMSE, todas as outras métricas obtiveram diminuição de valores no segundo modelo, por mais que não sejam significativas. Podemos concluir que com menos atributos o segundo modelo conseguiu uma performance semelhante, sendo o ideal para produção pois com um custo computacional e complexidade menor manteve o desempenho.

📄 
Segue o link para acessar o código na integra: Código

Em conclusão, o uso da técnica de Seleção de Atributos com o algoritmo Random Forest provou ser uma abordagem eficaz para um melhor aproveitamento dos dados. No entanto, é importante lembrar que essas técnicas não são uma solução única para todos os problemas. A escolha da técnica de previsão deve ser guiada pela natureza dos dados e pelo problema em questão. Além disso, a qualidade dos resultados depende em grande parte da qualidade dos dados de entrada. Portanto, um esforço considerável deve ser dedicado ao pré-processamento(tratamento) dos dados e à escolha precisa das variáveis independentes.

Comentários

Formulário de contato

Nome

E-mail *

Mensagem *

Minha foto
Gustavo Câmara
Olá, meu nome é Gustavo e sou Analista de Dados, Desenvolvedor, Estudante de Engenharia de Software e apaixonado por tecnologia.

Postagens mais visitadas