5 dicas para melhorar a preparação dos seus dados em projetos de machine learning

Introdução: Por que a preparação dos dados é importante?

1. Remova dados duplicados

  • Impacto: Melhora a performance e a precisão do modelo.
  • Como fazer: Utilize funções como drop_duplicates() no Pandas para identificar e remover duplicatas.
import pandas as pd

# Exemplo de remoção de duplicatas
df = pd.DataFrame(
    {
        'Nome': ['Ana', 'Carlos', 'Ana'],
        'Idade': [25, 30, 25]}
    )
df_new = df.drop_duplicates()
print(f'Antes :{df}')
print(f'Depois :{df_new}')

2. Tratamento de valores faltantes

  • Preenchimento por média: df['coluna'].fillna(df['coluna'].mean())
  • Preenchimento por moda: df['coluna'].fillna(df['coluna'].mode()[0])
  • Remoção de registros: df.dropna()
# Preenchendo valores ausentes com a média
df['Idade'] = df['Idade'].fillna(df['Idade'].mean())
# Removendo linhas com valores ausentes
df = df.dropna()

3. Normalização e Padronização

  • Normalização: útil para algoritmos sensíveis à escala, como redes neurais.
  • Padronização: ideal para métodos que assumem distribuição normal, como regressão linear.
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df['Idade_normalizada'] = scaler.fit_transform(df[['Idade']])
	Nome	Idade	Idade_normalizada
0	Ana	 25	              0.0
1	Carlos	 30	          1.0

4. Identificação e remoção de outliers

  • Estratégias rápidas:
    • Boxplot: Visualize outliers com sns.boxplot().
    • Z-score: Remova pontos com Z-score maior que 3 ou menor que -3.
    • IQR: Calcule o intervalo interquartil e remova valores fora de 1,5 * IQ
import matplotlib.pyplot as plt

plt.boxplot(df['Idade'])
plt.show()
Q1 = df['Idade'].quantile(0.25)
Q3 = df['Idade'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['Idade'] < (Q1 - 1.5 * IQR)) | (df['Idade'] > (Q3 + 1.5 * IQR)))]

5. Balanceamento de classes

    import matplotlib.pyplot as plt
    import numpy as np
    from imblearn.over_sampling import SMOTE
    
    # Aplicando o SMOTE para oversampling
    smote = SMOTE(random_state=42)
    X_resampled, y_resampled = smote.fit_resample(df[['feature']], df['target'])
    
    df_resampled = pd.DataFrame({'feature': X_resampled.values.ravel(), 'target': y_resampled}) 
    # Plotando a distribuição das classes após o SMOTE
    plt.figure(figsize=(8, 6))
    plt.hist(df_resampled[df_resampled['target'] == 0]['feature'], bins=30, alpha=0.5, label='Classe 0')
    plt.hist(df_resampled[df_resampled['target'] == 1]['feature'], bins=30, alpha=0.5, label='Classe 1')
    plt.xlabel('Feature')
    plt.ylabel('Frequência')
    plt.title('Distribuição das Classes (Após SMOTE)')
    plt.legend()
    plt.show()
    
    from imblearn.under_sampling import RandomUnderSampler
    
    # Aplicando o RandomUnderSampler para undersampling
    rus = RandomUnderSampler(random_state=42)
    X_resampled, y_resampled = rus.fit_resample(df[['feature']], df['target'])
    
    df_resampled = pd.DataFrame({'feature': X_resampled.values.ravel(), 'target': y_resampled}) 
    
    # Plotando a distribuição das classes após o RandomUnderSampler
    plt.figure(figsize=(8, 6))
    plt.hist(df_resampled[df_resampled['target'] == 0]['feature'], bins=30, alpha=0.5, label='Classe 0')
    plt.hist(df_resampled[df_resampled['target'] == 1]['feature'], bins=30, alpha=0.5, label='Classe 1')
    plt.xlabel('Feature')
    plt.ylabel('Frequência')
    plt.title('Distribuição das Classes (Após RandomUnderSampler)')
    plt.legend()
    plt.show()
    

    Conclusão

    1. Mãos à obra aprendizado de máquina com Scikit-Learn, Keras & TensorFlow: conceitos, ferramentas e técnicas para a construção de sistemas inteligentes.
    2. Python para análise de dados
    3. An Introduction to Statistical Learning (Python e R)

    Deixe um comentário

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

    Rolar para cima
    ×