Curso
Execute e edite o código deste tutorial online
Executar códigoSe você quer aprender mais em Python, faça o curso gratuito da DataCamp Intro to Python for Data Science.
Você já se deparou com conjuntos de dados. Às vezes são pequenos, mas muitas vezes são enormes. Processar datasets muito grandes pode ser bem desafiador e facilmente virar gargalo.
O que torna esses datasets tão grandes? As features. Quanto mais features, maior tende a ser o conjunto de dados. Bem, nem sempre. Há datasets com muitas features mas poucas instâncias. Mas esse não é o foco aqui. A pergunta é: com um computador comum em mãos, como processar esse tipo de dataset sem sofrer?
Com frequência, em datasets de alta dimensionalidade, existem features totalmente irrelevantes, pouco significativas e sem importância. Já se observou que a contribuição dessas features costuma ser menor para a modelagem preditiva quando comparadas às features realmente críticas. Em alguns casos, a contribuição é nula. Essas features geram vários problemas que atrapalham uma modelagem preditiva eficiente:
- Alocação desnecessária de recursos para essas features.
- Elas funcionam como ruído, piorando bastante o desempenho do modelo de machine learning.
- O treinamento do modelo fica mais demorado.
Qual é a solução? A alternativa mais econômica é a seleção de features.
Seleção de features é o processo de escolher as variáveis mais relevantes de um determinado dataset. Em muitos casos, ela também melhora o desempenho do modelo de machine learning.
Interessante, né?
Você teve uma introdução informal à seleção de features e sua importância em Data Science e Machine Learning. Neste post, você vai ver:
- Introdução à seleção de features e por que ela é importante
- Diferença entre seleção de features e redução de dimensionalidade
- Diferentes tipos de métodos de seleção de features
- Implementação de vários métodos de seleção de features com o scikit-learn
Introdução à seleção de features
Seleção de features também é conhecida como seleção de variáveis ou seleção de atributos.
Em essência, é o processo de selecionar as features mais importantes/relevantes de um dataset.
Entendendo a importância da seleção de features
A importância da seleção de features fica mais clara quando você trabalha com um dataset que tem um número enorme de variáveis. Esse tipo de dataset é chamado de dataset de alta dimensionalidade. Com essa alta dimensionalidade, surgem vários problemas: o tempo de treinamento do modelo aumenta bastante, o modelo pode ficar excessivamente complexo e acabar sofrendo de overfitting.
Em conjuntos com muitas features, é comum existirem variáveis redundantes — extensões de outras variáveis essenciais. Essas variáveis redundantes também não contribuem de forma efetiva para o treinamento. Ou seja, é fundamental extrair as features mais importantes e relevantes para obter o melhor desempenho preditivo.
"O objetivo da seleção de variáveis é triplo: melhorar o desempenho preditivo dos preditores, fornecer preditores mais rápidos e econômicos e proporcionar melhor entendimento do processo subjacente que gerou os dados."
-An Introduction to Variable and Feature Selection
Agora vamos entender a diferença entre redução de dimensionalidade e seleção de features.
Às vezes, confundem seleção de features com redução de dimensionalidade. Mas são coisas diferentes. Ambas reduzem o número de atributos no dataset, porém a redução de dimensionalidade cria novas combinações de atributos (também chamada de transformação de features), enquanto a seleção de features inclui ou exclui atributos existentes sem alterá-los.
Alguns exemplos de métodos de redução de dimensionalidade são Análise de Componentes Principais (PCA), Decomposição em Valores Singulares (SVD), Análise Discriminante Linear (LDA), etc.
Resumindo a importância da seleção de features:
- Permite treinar os algoritmos de machine learning mais rapidamente.
- Reduz a complexidade do modelo e facilita a interpretação.
- Pode melhorar a acurácia se o subconjunto correto for escolhido.
- Reduz o overfitting.
Na próxima seção, você vai estudar os tipos gerais de métodos de seleção de features: métodos de filtro (Filter), de invólucro (Wrapper) e incorporados (Embedded).
Filter methods
A imagem a seguir descreve bem os métodos de seleção de features baseados em filtro:

Fonte da imagem: Analytics Vidhya
O método de filtro se baseia nas propriedades gerais dos dados para avaliar e escolher um subconjunto de features, sem envolver nenhum algoritmo de mineração/ML. Ele usa critérios como distância, informação, dependência e consistência. Utiliza técnicas de ranqueamento para selecionar variáveis, por sua simplicidade e capacidade de produzir features relevantes. Com o ranqueamento, as features irrelevantes são filtradas antes mesmo de iniciar a classificação.
Geralmente, métodos de filtro são usados como etapa de pré-processamento. A seleção é independente de qualquer algoritmo de machine learning. As features recebem uma pontuação estatística que mede sua correlação com a variável alvo. Correlação é um conceito contextual e varia de caso a caso. Você pode consultar a tabela abaixo para definir coeficientes de correlação para diferentes tipos de dados (neste caso, contínuos e categóricos).

Fonte da imagem: Analytics Vidhya
Exemplos de métodos de filtro incluem o teste qui-quadrado (Chi-squared), o ganho de informação e escores de coeficiente de correlação.
Em seguida, veremos os métodos Wrapper.
Wrapper methods
Assim como nos métodos de filtro, segue um infográfico que ajuda a entender melhor os métodos wrapper:

Fonte da imagem: Analytics Vidhya
Como você vê na imagem, um método wrapper precisa de um algoritmo de machine learning e usa seu desempenho como critério de avaliação. Ele busca o conjunto de features mais adequado ao algoritmo para melhorar o desempenho. Para avaliar, usa acurácia preditiva em tarefas de classificação e medidas de qualidade de agrupamento em clustering.
Alguns exemplos típicos de métodos wrapper são seleção sequencial para frente, eliminação para trás e eliminação recursiva de features, entre outros.
- Seleção para frente (Forward Selection): começa com um conjunto vazio de features. A melhor feature original é escolhida e adicionada. A cada iteração, a melhor entre as remanescentes é incluída.
- Eliminação para trás (Backward Elimination): começa com todas as features e, a cada passo, remove a pior do conjunto.
- Combinação de forward e backward: combina as abordagens, selecionando a melhor e removendo a pior a cada etapa.
- Eliminação recursiva de features (RFE): faz uma busca gulosa para encontrar o melhor subconjunto. Iterativamente cria modelos e determina a melhor ou pior feature em cada iteração, reconstruindo modelos com as restantes até explorar todas. Depois ranqueia as features pela ordem de eliminação. No pior caso, para N features, o RFE explora combinações em torno de 2N.
Perfeito!
Agora vamos aos métodos embedded.
Embedded methods
Métodos embedded são iterativos no sentido de considerar cada iteração do treinamento e extrair cuidadosamente as features que mais contribuem para aquele ciclo. Métodos de regularização são os mais comuns nessa categoria e penalizam features com base em um limite para os coeficientes.
Por isso, métodos de regularização também são chamados de métodos de penalização: introduzem restrições adicionais na otimização de um algoritmo preditivo (como uma regressão), forçando o modelo a ter menor complexidade (menos coeficientes).
Exemplos: LASSO, Elastic Net, Ridge Regression, etc.
Diferença entre métodos Filter e Wrapper
Pode ser confuso diferenciar filter e wrapper pelos seus funcionamentos. Vamos aos pontos em que divergem:
- Métodos de filtro não incorporam um modelo de ML para decidir se uma feature é boa ou ruim; métodos wrapper treinam um modelo com as features para decidir se são essenciais.
- Filter são muito mais rápidos, pois não treinam modelos. Já wrapper são custosos computacionalmente e, em datasets gigantes, podem não ser a opção mais eficaz.
- Filter podem falhar em encontrar o melhor subconjunto quando não há dados suficientes para modelar correlações; wrapper, por sua natureza exaustiva, tendem a encontrar subconjuntos melhores.
- Usar, no modelo final, features escolhidas por wrapper pode levar a overfitting, já que o processo as avaliou com o próprio modelo; features vindas de filter, na maioria dos casos, não causam overfitting.
Até aqui você viu a importância da seleção de features e sua diferença para redução de dimensionalidade, além dos principais tipos de métodos. Ótimo!
Agora, alguns cuidados ao executar a seleção de features:
Ponto importante
Você já entendeu o valor da seleção de features em um pipeline de ML e o que ela entrega quando bem integrada. Mas é essencial saber exatamente onde encaixá-la nesse pipeline.
Em termos simples: inclua a etapa de seleção de features antes de alimentar o modelo para treino, especialmente quando usar métodos de estimativa de acurácia como validação cruzada. Isso garante que a seleção aconteça no fold de dados imediatamente antes do treino. Se você fizer a seleção primeiro em todo o dataset e só depois fizer seleção/treino de modelo nas features escolhidas, é um erro grave.
Se a seleção for feita em todos os dados e depois você rodar a validação cruzada, os dados de teste de cada fold já terão sido usados para escolher as features, o que tende a enviesar o desempenho do seu modelo.
Chega de teoria! Vamos ao código.
Um estudo de caso em Python
Neste estudo, usaremos o dataset Pima Indians Diabetes. A descrição está aqui.
O dataset corresponde a uma tarefa de classificação: prever se uma pessoa tem diabetes com base em 8 features.
São 768 observações ao todo. A primeira tarefa é carregar o dataset para seguir adiante. Antes, vamos importar as dependências necessárias. Outras poderão ser importadas conforme o avanço.
import pandas as pd
import numpy as np
Agora que as dependências foram importadas, vamos carregar o dataset Pima Indians em um DataFrame com a biblioteca pandas.
data = pd.read_csv("diabetes.csv")
O dataset foi carregado com sucesso no DataFrame data. Vamos dar uma olhada.
data.head()

Você vê 8 features distintas e o rótulo 1 ou 0, onde 1 indica que a observação tem diabetes e 0 indica que não tem. Sabe-se que o dataset tem valores ausentes. Em particular, há observações faltantes em algumas colunas marcadas como zero. Pelo significado das colunas, é impraticável ter zero para certas medidas (por exemplo, IMC ou pressão arterial).
Para este tutorial, vamos usar diretamente a versão pré-processada do dataset.
# load data
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pd.read_csv(url, names=names)
Os dados foram carregados em um DataFrame chamado dataframe.
Vamos converter o DataFrame em um array NumPy para computação mais rápida. Também vamos separar features e rótulos em variáveis distintas.
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
Perfeito! Dados preparados.
Primeiro, vamos implementar o teste estatístico qui-quadrado (Chi-Squared) para features não negativas e selecionar 4 das melhores features do dataset. Já vimos que o teste qui-quadrado pertence à classe dos métodos de filtro. Se você quiser entender os detalhes, este vídeo explica muito bem.
O scikit-learn fornece a classe SelectKBest, que pode ser usada com vários testes estatísticos para selecionar um número específico de features — neste caso, qui-quadrado.
# Import the necessary libraries first
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
Bibliotecas importadas. Vamos ver em ação.
# Feature extraction
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X, Y)
# Summarize scores
np.set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
# Summarize selected features
print(features[0:5,:])
[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304]
[[148. 0. 33.6 50. ]
[ 85. 0. 26.6 31. ]
[183. 0. 23.3 32. ]
[ 89. 94. 28.1 21. ]
[137. 168. 43.1 33. ]]
Interpretação:
Você pode ver as pontuações para cada atributo e as 4 features escolhidas (as de maior pontuação): plas, test, mass e age. Essas pontuações ajudam a determinar as melhores variáveis para treinar seu modelo.
P.S.: A primeira linha indica os nomes das features. Para o pré-processamento, os nomes foram codificados numericamente.
Em seguida, vamos implementar a eliminação recursiva de features (RFE), um método wrapper.
O RFE funciona removendo recursivamente atributos e treinando um modelo com os atributos restantes.
Ele usa a acurácia do modelo para identificar quais atributos (e combinações) mais contribuem para prever a variável alvo.
Você pode saber mais sobre a classe RFE na documentação do scikit-learn.
# Import your necessary dependencies
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
Vamos usar RFE com Logistic Regression para selecionar as 3 melhores features. A escolha do algoritmo não é tão crítica, desde que seja competente e consistente.
# Feature extraction
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Num Features: %s" % (fit.n_features_))
print("Selected Features: %s" % (fit.support_))
print("Feature Ranking: %s" % (fit.ranking_))
Num Features: 3
Selected Features: [ True False False False False True True False]
Feature Ranking: [1 2 3 5 6 1 1 4]
O RFE escolheu as 3 principais features: preg, mass e pedi.
Elas estão marcadas como True no array support e com o valor “1” no array ranking, indicando sua força.
Agora vamos usar Ridge regression, que é uma técnica de regularização e também um método embedded de seleção.
Este artigo traz uma ótima explicação sobre Ridge. Vale conferir.
# First things first
from sklearn.linear_model import Ridge
Em seguida, vamos usar Ridge para ajustar o modelo e analisar os coeficientes (R2 é uma métrica comum para avaliar modelos de regressão).
Também consulte a documentação oficial do scikit-learn sobre Ridge.
ridge = Ridge(alpha=1.0)
ridge.fit(X,Y)
Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001)
Para interpretar melhor os resultados da Ridge, vamos criar uma função helper que imprime os coeficientes de forma amigável.
# A helper method for pretty-printing the coefficients
def pretty_print_coefs(coefs, names = None, sort = False):
if names == None:
names = ["X%s" % x for x in range(len(coefs))]
lst = zip(coefs, names)
if sort:
lst = sorted(lst, key = lambda x:-np.abs(x[0]))
return " + ".join("%s * %s" % (round(coef, 3), name)
for coef, name in lst)
Agora vamos passar os coeficientes do modelo Ridge para essa função e ver o resultado.
print ("Ridge model:", pretty_print_coefs(ridge.coef_))
Ridge model: 0.021 * X0 + 0.006 * X1 + -0.002 * X2 + 0.0 * X3 + -0.0 * X4 + 0.013 * X5 + 0.145 * X6 + 0.003 * X7
Você vê todos os coeficientes associados às variáveis. Isso ajuda novamente a escolher as features mais essenciais. Alguns pontos a lembrar ao aplicar Ridge:
- Também é conhecida como L2-regularization.
- Para features correlacionadas, os coeficientes tendem a ser semelhantes.
- Features com coeficientes negativos tendem a contribuir menos. Em cenários com muitas variáveis, esse score ajuda bastante na decisão final de seleção.
Com isso, concluímos o estudo de caso. Os métodos acima ajudam você a entender as features de um dataset de forma abrangente. Alguns pontos-chave:
- Seleção de features é parte do pré-processamento — geralmente a etapa mais demorada de um pipeline de ML.
- Essas técnicas permitem uma abordagem mais sistemática e amigável ao ML, facilitando a interpretação das variáveis.
Encerrando
Neste post, você viu um dos temas mais estudados em estatística: seleção de features. Também conheceu suas variações e as aplicou para identificar quais variáveis são importantes em um dataset.
Você pode levar este tutorial adiante incorporando uma medida de correlação em um método wrapper e comparar o desempenho. Nesse caminho, talvez você crie seu próprio mecanismo de seleção. É assim que se constrói a base para uma pesquisa sua. Pesquisadores também usam princípios de soft computing para seleção. Isso por si só é um campo inteiro de estudo. Além disso, experimente os algoritmos existentes em diferentes datasets e tire suas próprias conclusões.
Por que esses métodos tradicionais ainda funcionam?
Pergunta justa. Existem arquiteturas de redes neurais (por exemplo, CNNs) capazes de extrair features relevantes dos dados, mas elas também têm limitações. Usar uma CNN em um dataset tabular comum, que não tem propriedades típicas de imagens (translações, bordas, posição, contornos etc.), não é a melhor decisão. E quando há pouco dado e poucos recursos, treinar uma CNN em dados tabulares pode ser desperdício. Nesses cenários, os métodos que você estudou são extremamente úteis.
Alguns recursos para se aprofundar no tema:
- Feature Selection for Knowledge Discovery and Data Mining
- Subspace, Latent Structure, and Feature Selection: Statistical and Optimization Perspectives Workshop
- Feature Selection: Problem statement and Uses
- Using genetic algorithms for feature selection in Data Analytics
Referências usadas para escrever este tutorial:
- Data Mining: Concepts and Techniques; Jiawei Han Micheline Kamber Jian Pei.
- An introduction to feature selection
- Artigo da Analytics Vidhya sobre seleção de features
- Hierarchical and Mixed Model - curso DataCamp
- Feature Selection For Machine Learning in Python
- Outlier Detection in Stream Data by Machine Learning and Feature Selection Methods
- S. Visalakshi e V. Radha, "A literature review of feature selection techniques and applications: Review of feature selection in data mining," 2014 IEEE International Conference on Computational Intelligence and Computing Research, Coimbatore, 2014, pp. 1-6.
Fique à vontade para deixar suas dúvidas nos comentários!
