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
# 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ódigoEm 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
Postar um comentário