Ir para o conteúdo

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
710 1 3 Moubarek, Master. Halim Gonios ("William George") male nan 1 1 2661 15.2458 nan C
440 0 2 Kvillner, Mr. Johan Henrik Johannesson male 31 0 0 C.A. 18723 10.5 nan S
841 0 3 Alhomaki, Mr. Ilmari Rudolf male 20 0 0 SOTON/O2 3101287 7.925 nan S
721 1 2 Harper, Miss. Annie Jessie "Nina" female 6 0 1 248727 33 nan S
40 1 3 Nicola-Yarred, Miss. Jamila female 14 1 0 2651 11.2417 nan C
291 1 1 Barber, Miss. Ellen "Nellie" female 26 0 0 19877 78.85 nan S
301 1 3 Kelly, Miss. Anna Katherine "Annie Kate" female nan 0 0 9234 7.75 nan Q
334 0 3 Vander Planke, Mr. Leo Edmondus male 16 2 0 345764 18 nan S
209 1 3 Carr, Miss. Helen "Ellen" female 16 0 0 367231 7.75 nan Q
137 1 1 Newsom, Miss. Helen Monypeny female 19 0 2 11752 26.2833 D47 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 17.5 1 1 15.2458 C
2 male 31 0 0 10.5 S
3 male 20 0 0 7.925 S
2 female 6 0 1 33 S
3 female 14 1 0 11.2417 C
1 female 26 0 0 78.85 S
3 female 17.5 0 0 7.75 Q
3 male 16 2 0 18 S
3 female 16 0 0 7.75 Q
1 female 19 0 2 26.2833 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, random_state=42)

# 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 16 0 0 7.75 1
2 1 31 0 0 10.5 2
1 0 26 0 0 78.85 2
3 1 17.5 1 1 15.2458 0
3 1 16 2 0 18 2
3 1 20 0 0 7.925 2
1 0 19 0 2 26.2833 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, random_state=42)

# Preprocessing
df = preprocess(df)

# Display the first few rows of the dataset
print(df.sample(n=7, random_state=42).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.