Selecionando features — Minima redundância, máxima relevância!

Matheus Rodrigues Rugolo
Comunidade XP
4 min readSep 1, 2022

--

Experimentação ágil é chave para o sucesso com Data Science. Durante esse processo vamos nos deparar com datasets que requerem uma atenção especial em relação a engenharia e seleção das features. Em um contexto corporativo é essencial demonstrar o potencial valor de um idéia antes de explorarmos o melhor uso dos nossos dados ou a melhor parametrização possível de um modelo de machine learning.

Essa solução pode reduzir a dimensionalidade de features numéricas de uma master table, identificando clusters de variáveis numéricas redundantes e selecionando a mais relevante dentre elas. Isso potencialmente irá agilizar o processo de experimentação e ainda reduzir o custo de processamento, buscando não impactar a performance do experimento.

Caso prático!

Considere um projeto em uma empresa financeira onde tentamos entender o quão propenso um cliente está a comprar um produto de investimento com machine learning.

Além das features de características pessoais do cliente, neste contexto, é interessante extrair o máximo do histórico transacional financeiro dos mesmos. Considerando que as transações de crédito e débito de uma conta, especialmente de investimentos, são extremamente correlacionadas temos um case perfeito para demonstrar o exemplo.

Exemplo:

Se por exemplo o cliente faz uma aplicação de X reais a partir de sua conta, anteriormente a mesma conta precisar ter recebido um valor >= X. Como geralmente vamos extrair features a partir desses eventos acabaremos com alta correlação entre as mesmas.

Proposta de solução

Como nos deparamos constantemente com esse tipo de situação, a proposta do artigo é consolidar um método eficiente e “automático” de desconsiderar features redundantes considerando a sua relevância em relação a sua variável resposta. Com isso podemos manter a entrada de todos os dados em nosso pipeline de modelagem, garantindo que sempre ficamos com o conjunto mais eficiente de features.

Essa metodologia foi baseada no artigo “Maximum Relevance and Minimum Redundancy Feature Selection Methods for a Marketing Machine Learning Platform” por Zhenyu Zhao, Radhika Anand, Mallory Wang. Usamos também implementações de feature selection das bibliotecas feature_engine e sklearn.

Você pode encontrar a versão em inglês deste artigo publicado na biblioteca de exemplos da feature_engine, aqui.

Mão na massa!

Criando features

Para fins de demonstração, vamos utilizar a função make_classification do sklearn para criar um dataframe de feature que contenha correlação e portanto redundância. A partir deste, separamos X e y com pandas para garantir compatibilidade com a api do sklearn.

Separando clusters correlacionados

Com a tabela de features em mãos, o primeiro passo é identificar clusters de variáveis numéricas que são relacionadas. Para ganhar tempo utilizamos a implementação de um transformer já existente, o SmartCorrelatedSelection.

Essa implementação já está no padrão dos transformers do sklearn e é um componente para o paradigma de Pipelines que recomendo fortemente, dê uma olhada na documentação caso queira saber mais.

Aqui tomamos três decisões baseadas no caso:

  • Limite de Correlação: 0.97

Esse limite é um ponto de discussão importante para cada caso, selecionamos aqui para o exemplo um coeficiente alto para garantir que somentes features muito correlacionadas sejam desconsideradas.

Este é o método implementado mais eficiente para detectar relações, sejam elas lineares ou não.

  • Método de seleção: variance (porém não utilizamos a seleção)

Como não faremos uso da seleção implementada nesse Transformer esse método não se aplica para o caso.

Caso você esteja se perguntando, a nossa metodologia para seleção da feature se baseará em informação mutual entre a feature e a variável resposta. E essa implementação pode eventualmente extender essa classe com o método em questão.

Reduzindo a redundância considerando a relevância!

Com os clusters de features em mãos, vamos selecionar a que esteja mais relacionada com o nosso y (variável resposta) através do SelectKBest. Como vamos abordar o caso como um problema de classificação a nossa score_func será a mutual_info_classif (para regressores mutual_info_regression).

Fechamos essa etapa com a lista de features selecionadas.

Vale ressaltar que o coeficiente de 0.97 é extremamente conservador, então dificilmente perderemos algum poder preditivo eliminando features com esse grau de correlação.

Avaliando features selecionadas

Finalmente podemos avaliar se é interessante continuarmos o processo com o conjunto de features selecionadas. Como nosso foco é a redução de recursos de processamento e agilidade na experimentação utilizamos o cross_validate com o estimador RandomForestClassifier escolhido sem parametrização.

Desta maneira conseguimos avaliar rapidamente se houve uma redução ou aumento de performance do conjunto selecionado baseado em uma métrica selecionada.

Essa é uma maneira eficiente de abordar a experimentação, porém é recomendável utilizar uma avaliação mais robusta com GridSearchCV para melhor avaliar a performance e consequentemente garantir o melhor desempenho possível para o seu modelo.

Como melhorar esse processo?

Extendendo a idéia para ser aplicada rapidamente em qualquer caso, é possível criar processos que aplicam essa metodologia para facilitar a escolha de um threshold ideal baseado nas suas necessidades.

Fica aqui o snippet um pouco mais extenso com o exemplo para aguçar a sua imaginação.

Para explorar melhor o plot da demonstração instale a lib com pip install hiplot, é interativo e muito bacana.

--

--