Ir para o conteúdo

3. Preprocessing

O pré-processamento de dados é uma fase crítica no desenvolvimento de modelos de redes neurais, garantindo que os dados brutos sejam transformados em um formato adequado para treinamento e inferência eficazes. Redes neurais são altamente sensíveis à qualidade e ao formato dos dados de entrada. Dados mal preparados podem levar a convergência lenta, overfitting ou acurácia subótima. O pré-processamento mitiga esses problemas abordando ruído, inconsistências e incompatibilidades estruturais nos conjuntos de dados.

Tarefas Típicas de Pré-processamento

Tarefa Descrição
Limpeza de Texto Remover caracteres indesejados, stop words e realizar stemming/lematização.
Normalização Padronizar formatos de texto, como formatos de data e moeda.
Tokenização Dividir texto em palavras ou subpalavras para análise mais fácil.
Extração de Features Converter texto em features numéricas usando técnicas como TF-IDF ou embeddings.
Aumento de Dados Gerar dados sintéticos para aumentar o tamanho e a diversidade do conjunto de dados.

Um dataset típico para tarefas de aprendizado de máquina pode incluir colunas de diferentes tipos de dados — numéricos, categóricos e texto:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
232 0 3 Larsson, Mr. Bengt Edvin male 29 0 0 347067 7.775 nan S
210 1 1 Blank, Mr. Henry male 40 0 0 112277 31 A31 C
782 1 1 Dick, Mrs. Albert Adrian (Vera Gillespie) female 17 1 0 17474 57 B20 S
65 0 1 Stewart, Mr. Albert A male nan 0 0 PC 17605 27.7208 nan C
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C
414 0 2 Cunningham, Mr. Alfred Fleming male nan 0 0 239853 0 nan S
8 0 3 Palsson, Master. Gosta Leonard male 2 3 1 349909 21.075 nan S
528 0 1 Farthing, Mr. John male nan 0 0 PC 17483 221.779 C95 S
267 0 3 Panula, Mr. Ernesti Arvid male 16 4 1 3101295 39.6875 nan S
806 0 3 Johansson, Mr. Karl Johan male 31 0 0 347063 7.775 nan S

Linhas de amostra do dataset Titanic

Limpeza de Dados

A limpeza de dados envolve identificar e corrigir erros, inconsistências e valores faltantes no conjunto de dados. Valores faltantes, comuns em dados do mundo real, podem ser tratados por métodos de imputação como substituição pela média, mediana ou moda, ou removendo linhas/colunas afetadas se a perda for mínima. Outliers, que podem distorcer o treinamento de redes neurais, são detectados usando métodos estatísticos como z-scores ou intervalos interquartis. Dados inconsistentes, como formatos variados em texto, requerem padronização para garantir uniformidade.

Pclass Sex Age SibSp Parch Fare Embarked
1 male 34 0 0 26.55 S
2 female 19 1 0 26 S
1 male 54 0 0 51.8625 S
2 female 14 1 0 30.0708 C
1 male 58 0 0 29.7 C
3 female 25 1 0 7.925 S
1 male 50 1 0 55.9 S
2 male 34 0 0 0 S
3 male 19 0 0 8.05 S
2 female 45 0 0 13.5 S
import pandas as pd

# Preprocess the data
def preprocess(df):
    # Fill missing values
    df['Age'] = df['Age'].fillna(df['Age'].median())
    df['Embarked'] = df['Embarked'].fillna(df['Embarked'].mode()[0])
    df['Fare'] = df['Fare'].fillna(df['Fare'].median())

    # Select features
    features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
    return df[features]

# Load the Titanic dataset
df = pd.read_csv('https://raw.githubusercontent.com/hsandmann/ml/refs/heads/main/data/kaggle/titanic-dataset.csv')
df = df.sample(n=10)

# Preprocessing
df = preprocess(df)

# Display the first few rows of the dataset
print(df.to_markdown(index=False))

Codificação de Variáveis Categóricas

Dados categóricos, por natureza não numéricos, devem ser convertidos para a entrada de redes neurais. A codificação one-hot cria vetores binários para cada categoria, ex: transformando cores ['vermelho', 'azul', 'verde'] em [[1,0,0], [0,1,0], [0,0,1]]. Isso evita premissas ordinais mas aumenta a dimensionalidade. A codificação de rótulos atribui inteiros (ex: 0 para "vermelho", 1 para "azul"), adequada para categorias ordinais mas arriscada para categorias nominais devido à ordenação implícita.

Pclass Sex Age SibSp Parch Fare Embarked
3 1 29 0 0 7.75 1
1 0 29 0 0 211.338 2
1 0 19 1 0 91.0792 0
2 1 23 2 1 11.5 2
2 1 39 0 0 13 2
3 0 3 3 1 21.075 2
2 1 42 0 0 13 2
import pandas as pd
from sklearn.preprocessing import LabelEncoder

# Preprocess the data
def preprocess(df):
    # Fill missing values
    df['Age'] = df['Age'].fillna(df['Age'].median())
    df['Embarked'] = df['Embarked'].fillna(df['Embarked'].mode()[0])
    df['Fare'] = df['Fare'].fillna(df['Fare'].median())

    # Convert categorical variables
    label_encoder = LabelEncoder()
    df['Sex'] = label_encoder.fit_transform(df['Sex'])
    df['Embarked'] = label_encoder.fit_transform(df['Embarked'])

    # Select features
    features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
    return df[features]

# Load the Titanic dataset
df = pd.read_csv('https://raw.githubusercontent.com/hsandmann/ml/refs/heads/main/data/kaggle/titanic-dataset.csv')
df = df.sample(n=10)

# Preprocessing
df = preprocess(df)

# Display the first few rows of the dataset
print(df.sample(n=7).to_markdown(index=False))

Normalização e Padronização

A normalização escala features para um intervalo limitado, tipicamente \([0, 1]\), usando escalonamento min-max:

\[x' = \displaystyle \frac{x - \min(x)}{\max(x) - \min(x)}\]

Isso é crucial para redes neurais que empregam ativações sigmoid ou tanh, pois evita saturação.

A padronização (normalização z-score) transforma os dados para ter média \(0\) e desvio padrão \(1\):

\[x' = \frac{x - \mu}{\sigma}\]

onde \(\mu\) é a média e \(\sigma\) o desvio padrão. É preferida para redes com ativações ReLU ou quando as distribuições dos dados são similares à Gaussiana.