Imputação (Tratamento de Valores Ausentes)
Visão geral
O tratamento de valores ausentes é o conjunto de técnicas usadas para lidar com entradas faltantes (por exemplo, NaN, NULL, strings vazias) em conjuntos de dados de aprendizado de máquina (machine learning). Como a maioria dos algoritmos de AM espera uma matriz numérica completa, valores ausentes podem quebrar o treinamento, enviesar a avaliação ou degradar o desempenho de forma silenciosa.
Duas abordagens amplas dominam:
- Exclusão (análise de casos completos): remover linhas ou colunas com valores ausentes.
- Imputação (imputation): preencher valores ausentes usando uma regra ou um modelo preditivo.
Na prática, um bom tratamento de valores ausentes tem menos a ver com “preencher lacunas” e mais com:
- entender por que os valores estão ausentes,
- evitar vazamento de informação,
- preservar o significado estatístico das variáveis,
- e implementar a lógica corretamente em pipelines de treinamento/validação.
Este artigo cobre as principais estratégias, métodos comuns de imputação, mecanismos de ausência (MCAR/MAR/MNAR) e padrões práticos de pipeline.
Por que valores ausentes importam
A ausência de dados pode afetar o AM de várias formas:
- Compatibilidade com algoritmos: Muitos modelos (por exemplo, modelos lineares, SVMs, k-means) não aceitam
NaNs. Alguns aceitam (por exemplo, certas árvores com boosting de gradiente), mas, mesmo assim, a semântica da ausência importa. - Viés: Se a ausência estiver relacionada ao alvo (target) ou a covariáveis importantes, exclusão ou imputação ingênua pode enviesar estimativas e prejudicar a generalização.
- Conteúdo informacional: O fato de um valor estar ausente pode ser preditivo (por exemplo, “renda ausente” pode correlacionar com risco).
- Armadilhas de avaliação: Se a imputação for ajustada (fit) usando o conjunto de dados completo, ela pode vazar estatísticas do conjunto de teste para o treinamento. Isso é uma forma de Vazamento.
Mecanismos de ausência: MCAR, MAR, MNAR
Uma lente teórica fundamental é por que os dados estão ausentes. A taxonomia padrão:
MCAR (Missing Completely At Random)
A ausência não depende de dados observados ou não observados.
Exemplo: Um sensor perde leituras aleatoriamente devido a falhas intermitentes de transmissão não relacionadas ao ambiente.
Implicação: A exclusão tem menor probabilidade de introduzir viés (mas ainda reduz o tamanho amostral e o poder estatístico).
MAR (Missing At Random)
A ausência depende apenas de variáveis observadas.
Exemplo: “Renda” tem maior probabilidade de estar ausente para respondentes mais jovens (idade é observada), mas, condicionalmente à idade e a outras variáveis observadas, a ausência é independente da renda verdadeira.
Implicação: Métodos de imputação que condicionam em variáveis observadas (KNN, regressão, MICE) podem funcionar bem.
MNAR (Missing Not At Random)
A ausência depende do próprio valor ausente ou de fatores não observados.
Exemplo: Indivíduos de alta renda têm menor probabilidade de informar renda, mesmo após condicionar em demografia observada.
Implicação: Nenhum método de imputação consegue “resolver” completamente MNAR sem suposições ou dados adicionais. Você pode precisar de:
- modelagem explícita da ausência (modelos de seleção, modelos de mistura de padrões),
- análise de sensibilidade,
- coleta de dados adicionais, ou
- projetar variáveis que capturem o processo de ausência.
Nota prática: Em geral, você não consegue provar MCAR/MAR/MNAR apenas a partir do conjunto de dados. Combine conhecimento do domínio, análise exploratória e (limitados) testes estatísticos como o teste MCAR de Little. Trate suposições sobre o mecanismo como escolhas de modelagem.
Exclusão vs imputação
Estratégias de exclusão
Exclusão de linhas (listwise deletion)
Remover amostras com valores ausentes em qualquer variável obrigatória.
- Prós: Simples; preserva apenas valores observados “reais”.
- Contras: Pode desperdiçar dados; pode introduzir viés a menos que seja MCAR; pode distorcer o balanceamento de classes em classificação.
Exclusão de colunas
Remover variáveis com muitas entradas ausentes.
- Prós: Simples; pode remover variáveis ruidosas/pouco confiáveis.
- Contras: Pode descartar sinal valioso; pode remover um confundidor importante.
Exclusão por pares (pairwise deletion, menos comum em pipelines de AM)
Usar dados disponíveis por cálculo (por exemplo, correlação). Isso é mais difícil de integrar ao treinamento típico de modelos e pode produzir resultados inconsistentes.
Quando a exclusão é aceitável
A exclusão pode ser razoável quando:
- a ausência é rara (por exemplo, <1–5% das linhas) e plausivelmente MCAR,
- o conjunto de dados é grande o suficiente para tolerar a perda de amostras,
- o padrão de ausência está majoritariamente restrito a variáveis não críticas,
- ou o domínio exige apenas valores observados (por exemplo, certos relatórios regulatórios).
Ainda assim, avalie o impacto: compare distribuições/proporções de classe antes e depois da exclusão.
Métodos simples de imputação (imputação única)
Métodos simples são rápidos, fortes baselines e frequentemente competitivos — especialmente quando a ausência é leve.
Imputação por média/mediana (numérico)
Substitua valores numéricos ausentes por:
- média: boa para distribuições aproximadamente simétricas,
- mediana: mais robusta a outliers e assimetria.
Na prática, a mediana é frequentemente mais segura.
Exemplo (pandas):
import pandas as pd
df["age"] = df["age"].fillna(df["age"].median())
df["income"] = df["income"].fillna(df["income"].mean())
Armadilha: Imputação por média/mediana reduz a variância e pode enfraquecer relações, especialmente correlações.
Imputação por moda (categórico)
Substitua valores categóricos ausentes pela categoria mais frequente.
df["city"] = df["city"].fillna(df["city"].mode().iloc[0])
Armadilha: Pode super-representar a classe mais comum e ocultar padrões significativos de ausência.
Constante / categoria “missing”
Para variáveis categóricas, uma abordagem comum é tratar a ausência como sua própria categoria (por exemplo, "__MISSING__"), e então codificar.
Isso funciona particularmente bem com codificação one-hot (one-hot encoding) porque o modelo pode aprender se a “ausência” em si é preditiva.
Isso combina naturalmente com Codificação One-Hot.
Variáveis indicadoras de ausência (“was_missing”)
Adicione uma variável binária indicando se um valor estava originalmente ausente e, então, imputar a variável original com um valor simples.
Por que ajuda: o modelo pode usar a “ausência como sinal” enquanto ainda recebe uma entrada numérica completa.
Exemplo:
df["age_was_missing"] = df["age"].isna().astype(int)
df["age"] = df["age"].fillna(df["age"].median())
Muitas bibliotecas conseguem gerar esses indicadores automaticamente (veja a seção de pipelines).
Imputação por grupo
Impute dentro de grupos (por exemplo, renda mediana dentro do país) para respeitar a estrutura.
Exemplo: mediana por country:
df["income"] = df["income"].fillna(df.groupby("country")["income"].transform("median"))
Armadilha: Se a variável de agrupamento for correlacionada com o alvo, garanta que a variável de agrupamento esteja disponível em inferência e evite usar grupos derivados do alvo.
Imputação KNN
A imputação KNN preenche valores ausentes usando valores das linhas mais similares (vizinhos) com base em outras variáveis.
- Prós: Captura estrutura local; pode superar média/mediana quando as variáveis são correlacionadas.
- Contras: Sensível à escala das variáveis; caro em conjuntos grandes; tem dificuldade com dados esparsos de alta dimensionalidade; requer uma métrica de distância que faça sentido.
Pontos práticos importantes:
- Escalone variáveis numéricas antes dos cálculos de distância do KNN (ou use uma métrica robusta à escala).
- Codifique variáveis categóricas com cuidado (codificação ordinal ingênua pode distorcer distâncias).
No scikit-learn:
KNNImputerusa distância Euclidiana sobre variáveis disponíveis.
Imputação baseada em modelo (imputação única)
Abordagens baseadas em modelo aprendem um modelo preditivo para cada variável com valores ausentes, usando outras variáveis como entradas.
Imputação por regressão/classificação
Para uma variável numérica (X_j), treine um modelo de regressão ( \hat{f}j(\mathbf{X}{-j}) ) nas linhas onde (X_j) é observado e, então, preveja as entradas ausentes. Para variáveis categóricas, use classificação.
As escolhas de modelo variam de regressão linear a random forests a boosting de gradiente.
- Prós: Usa relações multivariadas; flexível.
- Contras: Pode sofrer overfitting; pode ser computacionalmente mais pesado; requer cuidado com treinamento/validação para evitar vazamento.
Imputação iterativa (estilo MICE, passagem única vs iterativa)
Um padrão comum é a imputação iterativa:
- Inicialize valores ausentes (por exemplo, com média).
- Para cada variável com valores ausentes, ajuste um modelo para predizê-la a partir das outras variáveis.
- Atualize as imputações.
- Repita por várias iterações.
Isso é frequentemente chamado de “MICE” em espírito (embora a imputação múltipla seja o arcabouço estatístico completo; veja abaixo).
No scikit-learn, IterativeImputer implementa uma versão disso (experimental em algumas versões).
Fatoração de matriz e EM (cenários especializados)
Em sistemas de recomendação e em algumas tarefas tabulares, a ausência pode ser tratada como entradas não observadas em uma matriz e inferida via:
- fatoração de matriz (suposições de baixa patente),
- expectation-maximization (EM) para modelos probabilísticos.
Essas abordagens exigem suposições de modelagem mais fortes, mas podem ser poderosas quando os dados naturalmente formam uma matriz (usuários × itens).
Imputação com aprendizado profundo (quando justificável)
Autoencoders e outros modelos generativos profundos podem imputar valores ausentes, especialmente para dados complexos. Em geral, exigem mais dados e ajuste cuidadoso e são mais úteis quando:
- a ausência é extensa,
- as relações são altamente não lineares,
- ou a própria imputação é parte central da abordagem de modelagem.
Para muitos problemas tabulares padrão de AM, abordagens mais simples frequentemente vencem em confiabilidade e manutenibilidade.
Imputação múltipla (representando adequadamente a incerteza)
Imputação única produz um conjunto de dados preenchido e trata valores imputados como conhecidos, o que subestima a incerteza. A imputação múltipla resolve isso criando vários conjuntos de dados completos plausíveis.
Ideia central
- Gere (m) conjuntos de dados imputados (por exemplo, (m=5) a (20)), cada um refletindo a incerteza da imputação.
- Treine/avalie o modelo em cada conjunto de dados.
- Combine estimativas (por exemplo, coeficientes, métricas) usando regras como as regras de Rubin.
Isso é comum em estatística e epidemiologia; em AM, é usado quando a quantificação de incerteza importa ou a ausência é substancial.
MICE (Multiple Imputation by Chained Equations)
MICE é um procedimento amplamente usado de imputação múltipla:
- modela iterativamente cada variável com valores ausentes condicionada às demais,
- amostra imputações a partir de distribuições preditivas (não apenas predições pontuais),
- produz múltiplos conjuntos de dados completos.
Nota prática para AM: Se seu objetivo é pura acurácia preditiva, a imputação múltipla nem sempre é necessária. Se seu objetivo inclui inferência, intervalos de confiança, auditorias de justiça (fairness) ou tomada de decisão robusta, a imputação múltipla pode ser valiosa.
Preocupações práticas e armadilhas comuns
Prevenindo vazamento
A imputação deve ser ajustada (fit) apenas nos dados de treinamento e, então, aplicada aos dados de validação/teste. Caso contrário, o imputador “vê” informação distribucional do conjunto de teste.
Isso é uma forma clássica de Vazamento.
Padrão ruim:
imputer.fit_transform(all_data)e então dividir.
Padrão bom:
- dividir primeiro,
imputer.fit(X_train),imputer.transform(X_valid)/imputer.transform(X_test).
Isso é mais fácil de garantir usando pipelines (veja abaixo).
Compatibilidade com validação cruzada
Em validação cruzada k-fold, a imputação deve ser reajustada dentro de cada fold na porção de treinamento do fold. Usar um pipeline garante isso automaticamente.
Ordem das etapas de pré-processamento
A ordem correta depende do método:
- Para média/mediana: impute antes de escalonar (scalers geralmente não lidam com NaNs).
- Para imputação KNN: escalonar antes do KNN pode ser importante porque distâncias dependem da escala. Na prática, você pode:
- escalonar com uma abordagem que consiga lidar com valores ausentes (nem todas conseguem), ou
- imputar com um método simples, escalonar e então rodar KNN como refinamento (mais complexo), ou
- usar
KNNImputerdiretamente e aceitar que variáveis em escalas maiores dominem, a menos que padronizadas antes de um modo consciente da ausência.
A maioria dos fluxos no scikit-learn faz: KNNImputer → StandardScaler, e garante que as variáveis sejam comparáveis (por exemplo, via seleção cuidadosa de variáveis ou unidades já padronizadas).
Ausência como sinal preditivo
Às vezes “ausente” é informativo. Estratégias:
- adicionar indicadores de ausência,
- tratar categoria ausente explicitamente para variáveis categóricas,
- usar modelos que conseguem aprender divisões por ausência (alguns boosters de árvore).
Cuidado: se a ausência correlaciona com o processo de coleta de dados de um modo que muda em produção, o modelo pode não generalizar.
Outliers e distribuições de cauda pesada
Imputação pela média é frágil sob outliers. Prefira mediana ou imputadores robustos baseados em modelo quando as distribuições são assimétricas.
Séries temporais e dados agrupados
Para séries temporais, imputação ingênua pode vazar informação do futuro:
- forward fill/backward fill deve respeitar a ordem temporal,
- use estatísticas de janela deslizante calculadas apenas a partir do passado,
- para séries agrupadas (por exemplo, por dispositivo), impute dentro de cada grupo e na ordem temporal.
Interações com codificação categórica
Se você usa codificação one-hot, garanta que a ausência seja tratada de forma consistente:
- ou impute
"__MISSING__"antes da codificação one-hot, - ou configure o codificador para lidar com valores ausentes (dependente da biblioteca).
Veja Codificação One-Hot para como escolhas de codificação afetam a modelagem.
Escolhendo uma abordagem: o “melhor” depende de restrições
Não existe um imputador universalmente melhor. Decida com base em:
- proporção e padrão de ausência,
- tipos de variáveis (numéricas vs categóricas),
- tamanho do conjunto de dados,
- objetivo de modelagem (predição vs inferência),
- e restrições operacionais (velocidade, simplicidade, reprodutibilidade).
Uma progressão forte de baseline costuma ser:
- Imputação simples (mediana/moda) + indicadores de ausência
- Imputação KNN (se o conjunto de dados for moderado, variáveis forem correlacionadas)
- Imputação iterativa/baseada em modelo (se as relações forem complexas e a ausência for substancial)
- Imputação múltipla (se a incerteza importar)
Implementação em pipeline (padrão recomendado)
No scikit-learn, você normalmente:
- aplica diferentes imputadores a colunas numéricas vs categóricas,
- depois codifica/escalona,
- tudo dentro de um
Pipeline+ColumnTransformer.
Isso garante que a imputação seja ajustada apenas nos folds de treinamento durante a validação cruzada.
Exemplo: pipeline de pré-processamento numérico + categórico
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
numeric_features = ["age", "income"]
categorical_features = ["city", "job"]
numeric_pipe = Pipeline(steps=[
("imputer", SimpleImputer(strategy="median", add_indicator=True)),
("scaler", StandardScaler())
])
categorical_pipe = Pipeline(steps=[
("imputer", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore"))
])
preprocess = ColumnTransformer(
transformers=[
("num", numeric_pipe, numeric_features),
("cat", categorical_pipe, categorical_features),
]
)
clf = Pipeline(steps=[
("preprocess", preprocess),
("model", LogisticRegression(max_iter=200))
])
# Fit on train only; safe for CV if used with cross_val_score / GridSearchCV
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
Notas:
add_indicator=Trueadiciona flags de ausência para variáveis numéricas.handle_unknown="ignore"evita falhas quando novas categorias aparecem em inferência.
Exemplo: imputação KNN para variáveis numéricas
from sklearn.impute import KNNImputer
numeric_pipe = Pipeline(steps=[
("imputer", KNNImputer(n_neighbors=5, weights="distance")),
("scaler", StandardScaler())
])
Considerações:
- KNN pode ser lento para conjuntos grandes.
- Escalonamento e seleção de variáveis podem afetar fortemente os resultados. (Veja Seleção de Variáveis.)
Exemplo: imputação iterativa/baseada em modelo
from sklearn.experimental import enable_iterative_imputer # noqa: F401
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor
numeric_pipe = Pipeline(steps=[
("imputer", IterativeImputer(
estimator=RandomForestRegressor(n_estimators=200, random_state=0),
max_iter=10,
random_state=0
)),
("scaler", StandardScaler())
])
Isso pode capturar relações não lineares, mas é mais pesado e pode sofrer overfitting se não for ajustado.
Avaliação prática: como escolher um método de imputação
Um fluxo de trabalho robusto é:
Traçar o perfil da ausência
- Taxas de ausência por coluna
- Padrões de ausência (certas colunas faltam juntas?)
- Relação entre indicadores de ausência e o alvo
Começar com um baseline forte
- numérico: mediana + indicador de ausência
- categórico: mais frequente ou “categoria de ausente” explícita
Comparar alternativas usando validação cruzada
- Implementar cada abordagem como pipeline
- Avaliar com métricas e divisões apropriadas
- Observar instabilidade (alta variância entre folds)
Verificar impactos a jusante
- mudanças de distribuição devido à imputação,
- mudanças na calibração do modelo,
- mudanças em justiça (fairness) ou desempenho por subgrupos.
Anti-padrões comuns a evitar
- Imputar antes da divisão treino/teste (vazamento).
- Usar um sentinel “número mágico” (por exemplo,
-999) sem um indicador e sem garantir que o modelo consiga interpretá-lo corretamente. Modelos de árvore podem explorá-lo; modelos lineares podem ser distorcidos. - Imputação pela média em variáveis fortemente assimétricas sem considerar transformações por mediana/log.
- Imputação baseada em distância sem escalonamento (KNN dominado por variáveis em grande escala).
- Assumir que MNAR é resolvido por imputação sofisticada; frequentemente requer intervenção do domínio.
Resumo
A imputação é uma parte central da engenharia de variáveis e da confiabilidade do modelo. Um tratamento eficaz de valores ausentes combina:
- entendimento dos mecanismos de ausência (MCAR/MAR/MNAR),
- uma decisão entre exclusão e imputação com base em viés–variância e restrições dos dados,
- métodos de imputação apropriados (simples, KNN, baseado em modelo, imputação múltipla),
- e implementação cuidadosa em pipeline para prevenir Vazamento.
Em muitos sistemas de AM em produção, imputação por mediana/moda + indicadores de ausência dentro de um pipeline é um padrão forte e defensável. A partir daí, você pode justificar imputadores mais complexos quando a ausência é substancial, as relações são fortemente multivariadas ou a quantificação de incerteza é necessária.