Seleção e engenharia de features em machine learning

O que são features?

  • Idade do passageiro
  • Classe da cabine
  • Sexo

Seleção de features e engenharia de features

  1. Seleção de Features: Aqui, escolhemos as variáveis que realmente agregam valor ao modelo, removendo aquelas que não são úteis ou que podem prejudicar a performance.
  2. Engenharia de Features: Envolve transformar as variáveis de forma que fiquem mais fáceis de interpretar pelo modelo. Isso pode incluir criar novas features a partir de outras ou modificar o formato de variáveis existentes.

Por que isso é importante?

  1. Redução de Overfitting: Incluir muitas features irrelevantes pode fazer com que o modelo memorize os dados de treino em vez de aprender padrões. Isso resulta em uma performance fraca em dados novos.
  2. Melhoria da Interpretabilidade: Modelos com menos features são geralmente mais fáceis de interpretar, facilitando a comunicação dos resultados e decisões com stakeholders.
  3. Eficiência Computacional: Menos features significam menos cálculos, o que pode acelerar o treinamento e a predição, especialmente em grandes conjuntos de dados.
  4. Aumento da Acurácia: Features relevantes ajudam o modelo a capturar melhor os padrões dos dados, levando a um aumento na precisão.

Exemplos práticos de seleção e engenharia de features

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# Carregar dataset Titanic
url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'
data = pd.read_csv(url)

# Exibir primeiras linhas
data.head()
Head dataset titanic
  • Pclass: Classe do passageiro (1ª, 2ª ou 3ª classe)
  • Sex: Sexo do passageiro
  • Age: Idade do passageiro
  • Fare: Valor da passagem
  • Embarked: Porto de embarque
  • Survived: Se o passageiro sobreviveu (essa é a variável que queremos prever, ou seja, nosso “label”)
# Selecionar features mais relevantes
features = ['Pclass', 'Sex', 'Age', 'Fare']
X = data[features]
y = data['Survived']

# Preencher valores ausentes na coluna 'Age' com a mediana
X['Age'].fillna(X['Age'].median(), inplace=True)

# Transformar a coluna 'Sex' em valores numéricos (0 = female, 1 = male)
X['Sex'] = X['Sex'].map({'male': 1, 'female': 0})

# Dividir os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Treinar o modelo
model = RandomForestClassifier()
model.fit(X_train, y_train)

# Fazer previsões e calcular acurácia
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Acurácia com features simples: {accuracy:.2f}')
Acurácia com features simples: 0.78
  • Criar a feature “Tamanho da Família” somando o número de irmãos/esposas e pais/filhos a bordo.
  • Transformar o valor da passagem (Fare) em categorias, para capturar melhor as diferenças entre passageiros ricos e pobres.
# Criar feature 'Tamanho da Família'
data['FamilySize'] = data['SibSp'] + data['Parch']

# Categorizar a coluna 'Fare'
data['Fare_cat'] = pd.qcut(data['Fare'], 4, labels=[1, 2, 3, 4])

# Atualizar features com novas variáveis
features_engineered = ['Pclass', 'Sex', 'Age', 'FamilySize', 'Fare_cat']
X_engineered = data[features_engineered]

# Preencher valores ausentes e mapear 'Sex' como antes
X_engineered['Age'].fillna(X_engineered['Age'].median(), inplace=True)
X_engineered['Sex'] = X_engineered['Sex'].map({'male': 1, 'female': 0})

# Dividir os dados novamente
X_train_eng, X_test_eng, y_train_eng, y_test_eng = train_test_split(X_engineered, y, test_size=0.2, random_state=42)

# Treinar e avaliar o novo modelo
model.fit(X_train_eng, y_train_eng)
y_pred_eng = model.predict(X_test_eng)
accuracy_eng = accuracy_score(y_test_eng, y_pred_eng)
print(f'Acurácia com features aprimoradas: {accuracy_eng:.2f}')
Acurácia com features aprimoradas: 0.81

Implementando técnicas mais avançadas de seleção de features

1. Análise de Correlação: Podemos usar a correlação para identificar quais features têm maior relação com a variável alvo (sobrevivência).

import seaborn as sns
import matplotlib.pyplot as plt

# Calcular a matriz de correlação, utilizando apenas as colunas numéricas.
correlation_matrix = data.select_dtypes(include=['number']).corr()

# Plotar a matriz de correlação
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Matriz de Correlação')
plt.show()
Matriz de correlação
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# Modelo de regressão logística
model = LogisticRegression(max_iter=1000)
rfe = RFE(model, n_features_to_select=3)
fit = rfe.fit(X_train, y_train)

# Features selecionadas
print("Features selecionadas:", X_train.columns[fit.support_])
Features selecionadas: Index(['Pclass', 'Sex', 'Age'], dtype='object')
from sklearn.ensemble import RandomForestRegressor

# Treinar um modelo Random Forest
model = RandomForestRegressor()
model.fit(X_train, y_train)

# Importância das features
importances = model.feature_importances_

# Plotar a importância das features
plt.figure(figsize=(10, 6))
plt.barh(X_train.columns, importances)
plt.xlabel('Importância das Features')
plt.title('Importância das Features no Modelo de Sobreviventes do Titanic')
plt.show()
Feature importance

Problemas relacionados às features

  • A presença de dados ausentes pode comprometer a análise e o desempenho do modelo. Existem várias abordagens para lidar com isso, como a imputação (substituição de valores ausentes por médias, medianas, ou valores mais comuns) ou a exclusão de registros incompletos.
  • Valores extremos podem distorcer a análise estatística e o desempenho do modelo. Técnicas de detecção de outliers (como boxplots e z-scores) podem ser usadas para identificar e decidir se devem ser removidos ou tratados.
  • Features categóricas precisam ser convertidas em um formato numérico para que possam ser utilizadas em modelos. Técnicas como one-hot encoding e label encoding são fundamentais.
  • Quando uma feature categórica possui muitos níveis únicos (alta cardinalidade), isso pode levar a problemas de sobreajuste (overfitting). Técnicas de agrupamento ou o uso de embeddings podem ajudar a contornar esse problema.
  • Features irrelevantes ou redundantes podem reduzir a acurácia do modelo e aumentar o tempo de treinamento. Técnicas de seleção de features ajudam a identificar quais features são mais importantes.
  • Algumas features podem interagir entre si, afetando a saída do modelo de maneira não linear. Criar features que representem essas interações (por exemplo, multiplicação ou combinação) pode melhorar a performance.
  • Algumas técnicas estatísticas e de machine learning assumem que os dados seguem uma distribuição normal. Se as features não forem normalmente distribuídas, pode ser necessário aplicar transformações (como log ou raiz quadrada).
  • Se as features contêm muita variação (high variance) em diferentes subconjuntos dos dados, isso pode levar a um desempenho inconsistente do modelo. Técnicas de regularização (como L1 e L2) podem ajudar a controlar isso.
  • A multicolinearidade ocorre quando duas ou mais features são altamente correlacionadas, o que pode dificultar a interpretação dos coeficientes e a estabilidade do modelo.

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)

1 comentário em “Seleção e engenharia de features em machine learning”

  1. Pingback: Regularização em Machine Learning: Técnicas e Benefícios para Modelos Mais Robustos - IA Com Café

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