Seus recursos são importantes? Isso não significa que eles sejam bons - KDnuggets

Seus recursos são importantes? Isso não significa que eles sejam bons – KDnuggets

Nó Fonte: 2893531

Seus recursos são importantes? Isso não significa que eles sejam bons
[Imagem do autor]

 

O conceito de “importância do recurso” é amplamente utilizado no aprendizado de máquina como o tipo mais básico de explicabilidade do modelo. Por exemplo, é usado na Eliminação de Recursos Recursivos (RFE), para eliminar iterativamente o recurso menos importante do modelo.

No entanto, há um equívoco sobre isso.

O fato de um recurso ser importante não significa que seja benéfico para o modelo!

Na verdade, quando dizemos que uma característica é importante, isso significa simplesmente que a característica traz uma grande contribuição para as previsões feitas pelo modelo. Mas devemos considerar que tal contribuição pode estar errada.

Veja um exemplo simples: um cientista de dados esquece acidentalmente o ID do cliente entre os recursos de seu modelo. O modelo usa o Customer ID como um recurso altamente preditivo. Como consequência, esse recurso terá uma grande importância, mesmo que esteja realmente piorando o modelo, porque não pode funcionar bem em dados não vistos.

Para tornar as coisas mais claras, precisaremos fazer uma distinção entre dois conceitos:

  • Contribuição de previsão: que parte das previsões se deve ao recurso; isso é equivalente à importância do recurso.
  • Contribuição de erro: que parte dos erros de previsão se deve à presença do recurso no modelo.

Neste artigo, veremos como calcular essas quantidades e como usá-las para obter insights valiosos sobre um modelo preditivo (e para melhorá-lo).

Nota: este artigo está focado no caso de regressão. Se você estiver mais interessado no caso de classificação, você pode ler “Quais recursos são prejudiciais para o seu modelo de classificação?”

Suponha que construímos um modelo para prever a renda das pessoas com base em seu trabalho, idade e nacionalidade. Agora usamos o modelo para fazer previsões sobre três pessoas.

Assim, temos a verdade básica, a previsão do modelo e o erro resultante:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Verdade fundamental, previsão do modelo e erro absoluto (em milhares de dólares). [Imagem do autor]

 

Quando temos um modelo preditivo, podemos sempre decompor as previsões do modelo nas contribuições trazidas pelos recursos individuais. Isso pode ser feito através de valores SHAP (se você não sabe como funcionam os valores SHAP, pode ler meu artigo: Valores SHAP explicados exatamente como você gostaria que alguém lhe explicasse).

Então, digamos que estes são os valores SHAP relativos ao nosso modelo para os três indivíduos.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Valores SHAP para as previsões do nosso modelo (em milhares de dólares). [Imagem do autor]

 

A principal propriedade dos valores SHAP é que eles são aditivos. Isso significa que — somando cada linha — obteremos a previsão do nosso modelo para aquele indivíduo. Por exemplo, se pegarmos a segunda linha: 72k $ +3k $ -22k $ = 53k $, que é exatamente a previsão do modelo para o segundo indivíduo.

Agora, os valores SHAP são um bom indicador da importância de um recurso para nossas previsões. Na verdade, quanto maior o valor (absoluto) do SHAP, mais influente será o recurso para a previsão sobre aquele indivíduo específico. Observe que estou falando sobre valores SHAP absolutos porque o sinal aqui não importa: um recurso é igualmente importante se aumentar ou diminuir a previsão.

Portanto, a contribuição de previsão de um recurso é igual à média dos valores SHAP absolutos desse recurso. Se você tiver os valores SHAP armazenados em um dataframe do Pandas, isso é tão simples quanto:

prediction_contribution = shap_values.abs().mean()

No nosso exemplo, este é o resultado:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Contribuição de previsão. [Imagem do autor]

 

Como você pode ver, o trabalho é claramente o recurso mais importante, pois, em média, representa 71.67 mil dólares da previsão final. A nacionalidade e a idade são respetivamente a segunda e a terceira característica mais relevante.

No entanto, o fato de um determinado recurso ser responsável por uma parte relevante da previsão final não diz nada sobre o desempenho do recurso. Para considerar também este aspecto, precisaremos calcular a “Contribuição do Erro”.

Digamos que queremos responder à seguinte pergunta: “Quais previsões o modelo faria se não tivesse o recurso trabalho?” Os valores SHAP nos permitem responder a esta pergunta. Na verdade, por serem aditivos, basta subtrair os valores SHAP relativos ao recurso trabalho partir das previsões feitas pelo modelo.

Claro, podemos repetir este procedimento para cada recurso. Em Pandas:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

Este é o resultado:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Previsões que obteríamos se retirássemos o respectivo recurso. [Imagem do autor]

 

Isso significa que, se não tivéssemos o recurso trabalho, então o modelo preveria 20 mil dólares para o primeiro indivíduo, -19 mil dólares para o segundo e -8 mil dólares para o terceiro. Em vez disso, se não tivéssemos o recurso idade, o modelo preveria 73 mil dólares para o primeiro indivíduo, 50 mil dólares para o segundo e assim por diante.

Como você pode ver, as previsões para cada indivíduo variam muito se removermos recursos diferentes. Como consequência, também os erros de previsão seriam muito diferentes. Podemos calculá-los facilmente:

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

O resultado é o seguinte:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Erros absolutos que obteríamos se retirássemos o respectivo recurso. [Imagem do autor]

 

Estes são os erros que obteríamos se retirássemos o respectivo recurso. Intuitivamente, se o erro for pequeno, a remoção do recurso não será um problema – nem mesmo benéfico – para o modelo. Se o erro for alto, remover o recurso não é uma boa ideia.

Mas podemos fazer mais do que isso. Na verdade, podemos calcular a diferença entre os erros do modelo completo e os erros que obteríamos sem o recurso:

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

Qual é:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Diferença entre os erros do modelo e os erros que teríamos sem o recurso. [Imagem do autor]

 

Se este número for:

  • negativo, então a presença do recurso leva a uma redução no erro de previsão, então o recurso funciona bem para essa observação!
  • positivo, então a presença do recurso leva a um aumento no erro de previsão, portanto o recurso é ruim para essa observação.

Podemos calcular a “Contribuição de Erro” como a média desses valores, para cada recurso. Em Pandas:

error_contribution = error_diff.mean()

Este é o resultado:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Contribuição de erro. [Imagem do autor]

 

Se este valor for positivo, significa que, em média, a presença do recurso no modelo leva a um erro maior. Assim, sem esse recurso, a previsão teria sido geralmente melhor. Em outras palavras, o recurso está fazendo mais mal do que bem!

Pelo contrário, quanto mais negativo for este valor, mais benéfico é o recurso para as previsões, uma vez que a sua presença conduz a erros menores.

Vamos tentar usar esses conceitos em um conjunto de dados real.

A seguir, usarei um conjunto de dados retirado de Picaret (uma biblioteca Python em Licença MIT). O conjunto de dados é denominado “Gold” e contém séries temporais de dados financeiros.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Amostra de conjunto de dados. Os recursos são todos expressos em porcentagem, então -4.07 significa um retorno de -4.07%. [Imagem do autor]

 

As características consistem nos retornos dos ativos financeiros respectivamente 22, 14, 7 e 1 dia antes do momento de observação (“T-22”, “T-14”, “T-7”, “T-1”). Aqui está a lista exaustiva de todos os ativos financeiros usados ​​como recursos preditivos:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Lista dos ativos disponíveis. Cada ativo é observado nos tempos -22, -14, -7 e -1. [Imagem do autor]

 

No total, temos 120 recursos.

O objetivo é prever o preço (retorno) do ouro com 22 dias de antecedência (“Gold_T+22”). Vamos dar uma olhada na variável de destino.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Histograma da variável. [Imagem do autor]

 

Depois de carregar o conjunto de dados, estas são as etapas que executei:

  1. Divida o conjunto de dados completo aleatoriamente: 33% das linhas no conjunto de dados de treinamento, outros 33% no conjunto de dados de validação e os 33% restantes no conjunto de dados de teste.
  2. Treine um LightGBM Regressor no conjunto de dados de treinamento.
  3. Faça previsões sobre conjuntos de dados de treinamento, validação e teste usando o modelo treinado na etapa anterior.
  4. Calcule valores SHAP de conjuntos de dados de treinamento, validação e teste, usando a biblioteca Python “shap”.
  5. Calcule a contribuição de previsão e a contribuição de erro de cada recurso em cada conjunto de dados (treinamento, validação e teste), usando o código que vimos no parágrafo anterior.

Vamos comparar a contribuição do erro e a contribuição da previsão no conjunto de dados de treinamento. Usaremos um gráfico de dispersão, para que os pontos identifiquem os 120 recursos do modelo.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Contribuição de previsão vs. contribuição de erro (no conjunto de dados de treinamento). [Imagem do autor]

 

Existe uma correlação altamente negativa entre a contribuição de previsão e a contribuição de erro no conjunto de treinamento.

E isso faz sentido: uma vez que o modelo aprende no conjunto de dados de treinamento, ele tende a atribuir alta importância (ou seja, alta contribuição de previsão) àqueles recursos que levam a uma grande redução no erro de previsão (ou seja, contribuição de erro altamente negativa).

Mas isso não acrescenta muito ao nosso conhecimento, certo?

Na verdade, o que realmente importa para nós é o conjunto de dados de validação. O conjunto de dados de validação é de fato o melhor proxy que podemos ter sobre como nossos recursos se comportarão em novos dados. Então, vamos fazer a mesma comparação no conjunto de validação.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Contribuição de previsão vs. contribuição de erro (no conjunto de dados de validação). [Imagem do autor]

 

Deste gráfico podemos extrair algumas informações muito mais interessantes.

Os recursos na parte inferior direita do gráfico são aqueles aos quais nosso modelo está atribuindo corretamente grande importância, pois na verdade trazem uma redução no erro de previsão.

Além disso, observe que “Gold_T-22” (o retorno do ouro 22 dias antes do período de observação) está funcionando muito bem em comparação com a importância que o modelo lhe atribui. Isso significa que esse recurso é possivelmente inadequado. E esta informação é particularmente interessante porque o ouro é o ativo que estamos tentando prever (“Gold_T+22”).

Por outro lado, os recursos que têm uma contribuição de erro acima de 0 estão piorando nossas previsões. Por exemplo, “US Bond ETF_T-1” altera em média a previsão do modelo em 0.092% (Contribuição de Predição), mas leva o modelo a fazer uma previsão em média 0.013% (Contribuição de Erro) pior do que teria sido sem esse recurso .

Podemos supor que todos os recursos com uma alta contribuição de erro (em comparação com sua contribuição de previsão) provavelmente estão sobreajustados ou, em geral, apresentam comportamento diferente no conjunto de treinamento e no conjunto de validação.

Vamos ver quais recursos têm a maior contribuição de erro.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Recursos classificados diminuindo a contribuição de erros. [Imagem do autor]

 

E agora os recursos com menor contribuição de erro:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Recursos classificados aumentando a contribuição de erros. [Imagem do autor]

 

Curiosamente, podemos observar que todas as feições com maior Contribuição de Erro são relativas a T-1 (1 dia antes do momento de observação), enquanto quase todas as feições com menor Contribuição de Erro são relativas a T-22 (22 dias antes do momento de observação). ).

Isto parece indicar que os recursos mais recentes são propensos a overfitting, enquanto os recursos mais distantes no tempo tendem a generalizar melhor.

Observe que, sem a Contribuição de Erro, nunca teríamos conhecido esse insight.

Os métodos tradicionais de eliminação de recursos recursivos (RFE) são baseados na remoção de recursos sem importância. Isso equivale a remover primeiro os recursos com uma pequena contribuição de previsão.

No entanto, com base no que dissemos no parágrafo anterior, faria mais sentido remover primeiro os recursos com maior contribuição de erro.

Para verificar se nossa intuição foi verificada, vamos comparar as duas abordagens:

  • RFE tradicional: removendo primeiro recursos inúteis (menor contribuição de previsão).
  • Nosso RFE: removendo recursos prejudiciais primeiro (maior contribuição de erro).

Vamos ver os resultados no conjunto de validação:

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Erro Médio Absoluto das duas estratégias no conjunto de validação. [Imagem do autor]

 

A melhor iteração para cada método foi circulada: é o modelo com 19 características para o RFE tradicional (linha azul) e o modelo com 17 características para o nosso RFE (linha laranja).

Em geral, parece que nosso método funciona bem: remover o recurso com a maior contribuição de erro leva a um MAE consistentemente menor em comparação com a remoção do recurso com a maior contribuição de previsão.

No entanto, você pode pensar que isso funciona bem apenas porque estamos ajustando demais o conjunto de validação. Afinal, estamos interessados ​​no resultado que obteremos no conjunto de testes.

Então, vamos ver a mesma comparação no conjunto de teste.

 

Seus recursos são importantes? Isso não significa que eles sejam bons
Erro Médio Absoluto das duas estratégias no conjunto de teste. [Imagem do autor]

 

O resultado é semelhante ao anterior. Mesmo que haja menos distância entre as duas linhas, o MAE obtido pela remoção do maior Contribuidor de Erro é claramente melhor do que o MAE obtido pela remoção do menor Contribuidor de Predição.

Como selecionamos os modelos que levam ao menor MAE no conjunto de validação, vamos ver o resultado deles no conjunto de teste:

  • Contribuição de previsão RFE (19 recursos). MAE no conjunto de teste: 2.04.
  • Contribuição de erro RFE (17 recursos). MAE no conjunto de teste: 1.94.

Portanto, o melhor MAE usando nosso método é 5% melhor comparado ao RFE tradicional!

O conceito de importância do recurso desempenha um papel fundamental no aprendizado de máquina. No entanto, a noção de “importância” é muitas vezes confundida com “bondade”.

Para distinguir entre estes dois aspectos introduzimos dois conceitos: Contribuição de Predição e Contribuição de Erro. Ambos os conceitos são baseados nos valores SHAP do conjunto de dados de validação e no artigo vimos o código Python para calculá-los.

Também os testamos em um conjunto de dados financeiros reais (no qual a tarefa é prever o preço do ouro) e provamos que a eliminação recursiva de recursos com base na contribuição de erro leva a um erro médio absoluto 5% melhor em comparação com o RFE tradicional baseado na contribuição de previsão.

Todo o código usado para este artigo pode ser encontrado em este caderno.

Obrigado por ler!

 
 
Samuele Mazanti é cientista líder de dados na Jakala e atualmente mora em Roma. É licenciado em Estatística e os seus principais interesses de investigação dizem respeito a aplicações de aprendizagem automática para a indústria. Ele também é criador de conteúdo freelance.

 
Óptimo estado. Original. Republicado com permissão.
 

Carimbo de hora:

Mais de KDnuggetsGenericName