Skip to content

O Guia Definitivo: Como Usar o Imputer do Scikit-learn

Updated on

Ao lidar com conjuntos de dados grandes, é quase inevitável encontrar valores faltantes. Lidar com dados faltantes de forma eficiente é um passo fundamental na jornada de pré-processamento de dados. O Imputer do Scikit-learn oferece um conjunto de estratégias robustas para essa tarefa. Neste artigo, mergulharemos nos Imputers SimpleImputer, IterativeImputer, KNNImputer do Scikit-learn e como utilizá-los para lidar com dados numéricos e categóricos.

Quer criar visualizações de dados de um DataFrame do Python Pandas rapidamente, sem código?

PyGWalker é uma biblioteca Python para Análise Exploratória de Dados com Visualização. PyGWalker (opens in a new tab) pode simplificar sua análise de dados e fluxo de trabalho de visualização de dados no Jupyter Notebook, transformando seu DataFrame pandas (e polars dataframe) em uma interface de usuário estilo Tableau para exploração visual.

PyGWalker para visualização de dados (opens in a new tab)

Revelando o Imputer

Antes de mergulharmos nos "como fazer", vamos primeiro entender o que é um Imputer. Basicamente, um imputer é um estimador que preenche valores faltantes em seu conjunto de dados. Para dados numéricos, ele utiliza estratégias como média, mediana ou constante, enquanto para dados categóricos, ele usa o valor mais frequente ou uma constante. Além disso, você pode treinar seu modelo para prever os valores faltantes, dependendo da complexidade dos seus dados e dos recursos disponíveis.

Neste guia, iremos focar principalmente nos Imputers SimpleImputer, IterativeImputer e KNNImputer do Scikit-learn. Além disso, mostraremos como criar um pipeline para imputar características categóricas e numéricas de forma transparente e alimentá-las em um modelo de aprendizado de máquina.

Configurando o Imputer do Scikit-learn

As funções de imputação do Scikit-learn oferecem uma maneira conveniente de lidar com dados faltantes usando apenas algumas linhas de código. Além disso, elas permitem criar pipelines, facilitando a reprodução dos resultados e melhorando o fluxo de trabalho de desenvolvimento de aprendizado de máquina.

Ambiente e Conjunto de Dados

Antes de entrarmos nos detalhes de como usar o Imputer do Scikit-learn, vamos configurar nosso ambiente e adquirir um conjunto de dados. Para este tutorial, usaremos o Banco de Dados de Diabetes dos Índios Pima, um conjunto de dados popular na comunidade de aprendizado de máquina.

Este conjunto de dados está disponível gratuitamente no Kaggle e pode ser baixado diretamente usando a API do Kaggle. No entanto, primeiro precisamos instalar as bibliotecas Python necessárias:

!pip install numpy pandas scikit-learn kaggle

Em seguida, vamos baixar o Banco de Dados de Diabetes dos Índios Pima usando a API do Kaggle:

!kaggle datasets download -d uciml/pima-indians-diabetes-database
!unzip pima-indians-diabetes-database.zip -d ./dataset

Agora que temos nosso conjunto de dados, vamos carregá-lo em um DataFrame do pandas e dar uma olhada:

import pandas as pd
 
df = pd.read_csv("./dataset/diabetes.csv")
print(df.head())

Explorando o Conjunto de Dados

Uma vez que tenhamos os dados carregados, é essencial entender sua estrutura. O Banco de Dados de Diabetes dos Índios Pima tem oito características numéricas e uma coluna alvo binária, "Outcome". As características estão relacionadas a várias métricas de saúde, como nível de glicose, pressão sanguínea e IMC, enquanto a coluna alvo indica se uma pessoa tem ou não diabetes.

Primeiro, vamos examinar a forma do nosso conjunto de dados:

print(df.shape)

Com essa saída, podemos confirmar que nosso conjunto de dados contém 768 linhas e 9 colunas.

Revelando Valores Faltantes

Em conjuntos de dados do mundo real, valores faltantes são bastante comuns. Portanto, antes de adentrarmos na modelagem de aprendizado de máquina, devemos identificar e tratar adequadamente esses valores faltantes.

Vamos verificar se há valores faltantes em nosso conjunto de dados:

valores_faltantes = df.isnull().sum()
print(valores_faltantes)

Em um cenário ideal, esse comando retornaria zeros para todas as colunas. No entanto, na prática, isso raramente acontece. Abordaremos como tratar esses valores faltantes nas próximas seções.

Imputando Valores Numéricos

No contexto do Imputer do Scikit-learn, distinguimos entre imputação numérica e imputação categórica. A imputação numérica é o processo de substituir valores numéricos faltantes por estimativas estatísticas. É comum usar a média, mediana ou moda como valor de substituição.

Para fins de nosso tutorial, vamos considerar que a coluna 'Pressão Sanguínea' possui valores faltantes. Nossa primeira tarefa é confirmar o número de valores faltantes:

print(df['Pressão Sanguínea'].isnull().sum())

Na próxima seção, aprenderemos como imputar esses valores faltantes usando o SimpleImputer do Scikit-learn.

Imputando Valores Numéricos com o SimpleImputer do Scikit-learn

O SimpleImputer do Scikit-learn fornece uma maneira simples de lidar com valores numéricos faltantes. Ele oferece várias estratégias, incluindo substituir valores faltantes pela média, mediana ou um valor constante. Vamos percorrer um exemplo de uso do SimpleImputer para imputar os valores faltantes na coluna 'Pressão Sanguínea'.

from sklearn.impute import SimpleImputer
 
# Cria uma instância do SimpleImputer
imputer = SimpleImputer(strategy='mean')
 
# Reformula a coluna em uma matriz 2D
pressao_sanguinea = df['Pressão Sanguínea'].values.reshape(-1, 1)
 
# Imputa os valores faltantes
pressao_sanguinea_imputada = imputer.fit_transform(pressao_sanguinea)
 
# Atualiza o DataFrame com os valores imputados
df['Pressão Sanguínea'] = pressao_sanguinea_imputada

Ao definir o parâmetro estratégia como 'mean', o SimpleImputer calcula a média dos valores disponíveis e substitui os valores ausentes por essa média. Você também pode usar 'median' ou 'constant' como estratégia, dependendo da natureza dos seus dados.

Após a imputação dos valores ausentes, é sempre uma boa prática verificar se ainda existem valores ausentes:

print(df['PressãoSanguinea'].isnull().sum())

Com os valores ausentes imputados, a saída deve ser 0, indicando que não há mais valores ausentes na coluna 'PressãoSanguinea'.

Imputando Valores Categóricos

Agora, vamos passar para a imputação de valores categóricos. Para este exemplo, vamos considerar a coluna 'EspessuraPele', que contém valores categóricos ausentes.

Similar à seção anterior, vamos primeiro verificar quantos valores ausentes estão presentes na coluna 'EspessuraPele':

print(df['EspessuraPele'].isnull().sum())

Para imputar valores categóricos, podemos usar a estratégia 'most_frequent' fornecida pelo SimpleImputer. Esta estratégia substitui os valores ausentes pelo valor mais frequente na coluna.

# Crie uma instância do SimpleImputer para valores categóricos
imputer_categorico = SimpleImputer(strategy='most_frequent')
 
# Redimensione a coluna em uma matriz 2D
espessura_pele = df['EspessuraPele'].values.reshape(-1, 1)
 
# Impute os valores ausentes
espessura_pele_imputada = imputer_categorico.fit_transform(espessura_pele)
 
# Atualize o DataFrame com os valores imputados
df['EspessuraPele'] = espessura_pele_imputada

Após a imputação dos valores ausentes, vamos confirmar se existem valores ausentes na coluna 'EspessuraPele':

print(df['EspessuraPele'].isnull().sum())

A saída deve ser 0, indicando que todos os valores categóricos ausentes na coluna 'EspessuraPele' foram imputados com sucesso.

Conclusão

Nesta parte do guia, aprendemos como usar o SimpleImputer do Scikit-learn para lidar com valores ausentes em colunas numéricas e categóricas. Exploramos estratégias como média, mediana e mais frequente para imputar valores ausentes com base na natureza dos dados.

A imputação é uma etapa essencial no processo de pré-processamento de dados, pois nos permite reter informações valiosas e garantir que nossos modelos possam aprender com conjuntos de dados completos. Ao aproveitar o SimpleImputer do Scikit-learn, cientistas de dados e praticantes de aprendizado de máquina podem lidar de forma eficiente com dados ausentes e construir modelos robustos.