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
623 1 3 Nakid, Mr. Sahid male 20 1 1 2653 15.7417 nan C
261 0 3 Smith, Mr. Thomas male nan 0 0 384461 7.75 nan Q
350 0 3 Dimic, Mr. Jovan male 42 0 0 315088 8.6625 nan S
886 0 3 Rice, Mrs. William (Margaret Norton) female 39 0 5 382652 29.125 nan Q
42 0 2 Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott) female 27 1 0 11668 21 nan S
26 1 3 Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson) female 38 1 5 347077 31.3875 nan S
654 1 3 O'Leary, Miss. Hanora "Norah" female nan 0 0 330919 7.8292 nan Q
873 0 1 Carlsson, Mr. Frans Olof male 33 0 0 695 5 B51 B53 B55 S
79 1 2 Caldwell, Master. Alden Gates male 0.83 0 2 248738 29 nan S
69 1 3 Andersson, Miss. Erna Alexandra female 17 4 2 3101281 7.925 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 female 19 1 0 7.8542 S
1 male 26 0 0 31 S
1 female 38 1 0 71.2833 C
1 male 26 0 0 42.4 S
3 male 28 0 0 7.8958 S
1 male 60 1 1 79.2 C
1 female 26 1 0 89.1042 C
3 male 4 4 2 31.275 S
3 male 18 0 0 8.05 S
3 male 26 0 0 7.8958 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 18 0 0 8.3 2
2 0 24 1 2 65 2
3 0 9 2 2 34.375 2
1 1 31 1 0 52 2
3 1 49 0 0 0 2
2 1 23 2 1 11.5 2
1 1 47 0 0 25.5875 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.