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
126 1 3 Nicola-Yarred, Master. Elias male 12 1 0 2651 11.2417 nan C
515 0 3 Coleff, Mr. Satio male 24 0 0 349209 7.4958 nan S
648 1 1 Simonius-Blumer, Col. Oberst Alfons male 56 0 0 13213 35.5 A26 C
485 1 1 Bishop, Mr. Dickinson H male 25 1 0 11967 91.0792 B49 C
183 0 3 Asplund, Master. Clarence Gustaf Hugo male 9 4 2 347077 31.3875 nan S
313 0 2 Lahtinen, Mrs. William (Anna Sylfven) female 26 1 1 250651 26 nan S
419 0 2 Matthews, Mr. William John male 30 0 0 28228 13 nan S
260 1 2 Parrish, Mrs. (Lutie Davis) female 50 0 1 230433 26 nan S
422 0 3 Charters, Mr. David male 21 0 0 A/5. 13032 7.7333 nan Q
862 0 2 Giles, Mr. Frederick Edward male 21 1 0 28134 11.5 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
3 male 16 0 0 7.775 S
1 male 29 1 0 66.6 S
1 female 36 0 0 135.633 C
3 male 20 1 1 15.7417 C
3 male 21 0 0 8.4333 S
2 female 4 2 1 39 S
3 male 19 0 0 7.8958 S
1 male 21 0 1 77.2875 S
3 female 4 0 2 22.025 S
2 male 62 0 0 10.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 0 36 1 0 17.4 1
3 1 36 0 0 7.4958 1
3 1 16 1 1 20.25 1
3 1 40.5 0 0 7.75 0
3 0 27 0 0 7.925 1
3 1 20 0 0 7.8542 1
3 0 23.5 1 0 24.15 0
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.