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:
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\):
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.