Guia Abrangente para Pré-processamento de Dados: One-Hot Encoding e Tratamento de Dados Faltantes com Python
No campo da ciência de dados e aprendizado de máquina, o pré-processamento de dados é uma etapa crucial que pode influenciar significativamente o desempenho e a precisão dos seus modelos. Este guia abrangente explora técnicas essenciais de pré-processamento, como One-Hot Encoding, tratamento de dados faltantes, seleção de características e mais, utilizando bibliotecas poderosas do Python como pandas e scikit-learn. Vamos abordar esses conceitos com um exemplo prático usando o conjunto de dados Weather Australia.
Índice
- Introdução
- Compreendendo o Conjunto de Dados
- Tratamento de Dados Faltantes
- Seleção de Características
- Codificação de Rótulos
- One-Hot Encoding
- Tratamento de Dados Desbalanceados
- Divisão Treino-Teste
- Escalonamento de Características
- Conclusão
Introdução
O pré-processamento de dados é a base sobre a qual modelos robustos de aprendizado de máquina são construídos. Ele envolve transformar dados brutos em um formato limpo e organizado, tornando-os adequados para análise. Esse processo inclui:
- Tratamento de Dados Faltantes: Abordar lacunas no conjunto de dados.
- Codificação de Variáveis Categóricas: Converter dados não numéricos em formato numérico.
- Seleção de Características: Identificar e reter as características mais relevantes.
- Balanceamento do Conjunto de Dados: Garantir uma distribuição igual das classes.
- Escalonamento de Características: Normalizar os dados para melhorar o desempenho do modelo.
Vamos explorar esses conceitos passo a passo usando Python.
Compreendendo o Conjunto de Dados
Antes de mergulhar no pré-processamento, é crucial entender o conjunto de dados com o qual estamos trabalhando. Vamos utilizar o conjunto de dados Weather Australia, que contém 142.193 registros e 24 colunas. Este conjunto de dados inclui diversos atributos meteorológicos, como temperatura, precipitação, umidade e mais, junto com uma variável alvo que indica se irá chover no dia seguinte.
Amostra do Conjunto de Dados
1 2 3 |
Date,Location,MinTemp,MaxTemp,Rainfall,Evaporation,Sunshine,WindGustDir,WindGustSpeed,WindDir9am,WindDir3pm,WindSpeed9am,WindSpeed3pm,Humidity9am,Humidity3pm,Pressure9am,Pressure3pm,Cloud9am,Cloud3pm,Temp9am,Temp3pm,RainToday,RISK_MM,RainTomorrow 2008-12-01,Albury,13.4,22.9,0.6,NA,NA,W,44,W,WNW,20,24,71,22,1007.7,1007.1,8,NA,16.9,21.8,No,0,No ... (linhas adicionais) |
Tratamento de Dados Faltantes
Conjuntos de dados do mundo real frequentemente contêm valores faltantes. Tratar adequadamente essas lacunas é essencial para prevenir resultados distorcidos e garantir a precisão do modelo.
Dados Numéricos
As colunas numéricas em nosso conjunto de dados incluem MinTemp
, MaxTemp
, Rainfall
, Evaporation
, etc. Valores faltantes nessas colunas podem ser tratados imputando com medidas estatísticas como média, mediana ou moda.
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np from sklearn.impute import SimpleImputer # Inicializa o imputador com a estratégia de média imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # Lista de índices das colunas numéricas numerical_cols = [2,3,4,5,6,8,11,12,13,14,15,16,17,18,19,20] # Ajusta e transforma os dados X.iloc[:, numerical_cols] = imp_mean.fit_transform(X.iloc[:, numerical_cols]) |
Dados Categóricos
Colunas categóricas como Location
, WindGustDir
, WindDir9am
, etc., não podem ter seus valores faltantes imputados com média ou mediana. Em vez disso, usamos o valor mais frequente (moda) para preencher essas lacunas.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.impute import SimpleImputer # Lista de índices das colunas categóricas string_cols = [1,7,9,10,21] # Inicializa o imputador com a estratégia de valor mais frequente imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # Ajusta e transforma os dados X.iloc[:, string_cols] = imp_freq.fit_transform(X.iloc[:, string_cols]) |
Seleção de Características
A seleção de características envolve identificar as variáveis mais relevantes que contribuem para a tarefa de previsão. No nosso caso, iremos remover colunas irrelevantes ou redundantes, como Date
e RISK_MM
.
1 2 |
# Removendo as colunas 'RISK_MM' e 'Date' X.drop(['RISK_MM', 'Date'], axis=1, inplace=True) |
Codificação de Rótulos
A Codificação de Rótulos converte variáveis de alvo categóricas em formato numérico. Para tarefas de classificação binária, como prever chuva amanhã (Yes
ou No
), este método é direto.
1 2 3 4 5 6 7 |
from sklearn import preprocessing # Inicializa o LabelEncoder le = preprocessing.LabelEncoder() # Ajusta e transforma a variável alvo Y = le.fit_transform(Y) |
One-Hot Encoding
Enquanto a codificação de rótulos é adequada para dados ordinais, o One-Hot Encoding é preferido para dados nominais, onde as categorias não têm ordem inerente. Esta técnica cria colunas binárias para cada categoria, melhorando a capacidade do modelo de interpretar variáveis categóricas.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # Inicializa o ColumnTransformer com OneHotEncoder para colunas especificadas columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), [0,6,8,9,20])], remainder='passthrough' ) # Ajusta e transforma a matriz de características X = columnTransformer.fit_transform(X) |
Nota: As colunas [0,6,8,9,20] correspondem a características categóricas como Location
, WindGustDir
, etc.
Tratamento de Dados Desbalanceados
Conjuntos de dados desbalanceados, onde uma classe supera significativamente a outra, podem enviesar o modelo. Técnicas como oversampling e undersampling ajudam a balancear o conjunto de dados.
Oversampling
Oversampling Aleatório duplica instâncias da classe minoritária para balancear a distribuição das classes.
1 2 3 4 5 6 7 8 9 10 11 |
from imblearn.over_sampling import RandomOverSampler from collections import Counter # Inicializa o RandomOverSampler ros = RandomOverSampler(random_state=42) # Reamostra o conjunto de dados X, Y = ros.fit_resample(X, Y) # Verifica a nova distribuição das classes print(Counter(Y)) |
Saída:
1 |
Counter({0: 110316, 1: 110316}) |
Undersampling
Undersampling Aleatório reduz instâncias da classe majoritária, mas pode levar à perda de informação. Neste guia, empregamos oversampling para reter todos os pontos de dados.
Divisão Treino-Teste
Dividir o conjunto de dados em conjuntos de treino e teste é crucial para avaliar o desempenho do modelo em dados não vistos.
1 2 3 4 5 6 7 8 9 |
from sklearn.model_selection import train_test_split # Divide os dados: 80% treino, 20% teste X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.20, random_state=1 ) print(X_train.shape) # Saída: (176505, 115) print(X_test.shape) # Saída: (44127, 115) |
Escalonamento de Características
O escalonamento de características garante que todas as características numéricas contribuam igualmente para o desempenho do modelo.
Padronização
A padronização transforma os dados para terem uma média de 0 e um desvio padrão de 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from sklearn import preprocessing # Inicializa o StandardScaler sc = preprocessing.StandardScaler() # Ajusta nos dados de treino sc.fit(X_train) # Transforma os dados de treino e teste X_train = sc.transform(X_train) X_test = sc.transform(X_test) print(X_train.shape) # Saída: (176505, 115) print(X_test.shape) # Saída: (44127, 115) |
Normalização
A normalização escala as características para um intervalo entre 0 e 1. Embora não seja abordada neste guia, é outra técnica valiosa de escalonamento dependendo do conjunto de dados e dos requisitos do modelo.
1 2 3 4 5 6 7 8 |
from sklearn.preprocessing import MinMaxScaler # Inicializa o MinMaxScaler mm_scaler = MinMaxScaler() # Ajusta e transforma os dados X_train_mm = mm_scaler.fit_transform(X_train) X_test_mm = mm_scaler.transform(X_test) |
Conclusão
O pré-processamento eficaz de dados é fundamental para construir modelos de aprendizado de máquina de alto desempenho. Ao tratar meticulosamente dados faltantes, codificar variáveis categóricas, balancear o conjunto de dados e escalar características, você estabelece uma base sólida para suas tarefas preditivas. Este guia forneceu uma abordagem prática utilizando as robustas bibliotecas do Python, demonstrando como essas técnicas podem ser integradas de maneira fluida em seu fluxo de trabalho de ciência de dados.
Lembre-se, a qualidade dos seus dados influencia diretamente o sucesso dos seus modelos. Invista tempo no pré-processamento para desbloquear todo o potencial dos seus conjuntos de dados.
Palavras-chave
- Pré-processamento de Dados
- One-Hot Encoding
- Tratamento de Dados Faltantes
- Python pandas
- scikit-learn
- Aprendizado de Máquina
- Escalonamento de Características
- Dados Desbalanceados
- Codificação de Rótulos
- Variáveis Categóricas