Calibrando Modelos de Classificação Binária com Previsão Conforme

Tutorial prático de Previsões Conformes (Conformal Predictions) para quantificar incertezas em modelos de Classificação Binária.

Gustavo Bruschi
Data Hackers
12 min readJun 11, 2023

--

Essa foto é para demonstrar que modelos de Machine Learning para Classificações Binárias podem encontrar situações complicadas e gerar resultados pouco confiáveis e até equivocados. Source: Istoé

Nos tutoriais anteriores, dei uma breve explicada sobre o que é Previsão Conforme e alguns métodos para o caso de Classificação Multiclass. É um método versátil que pode transformar qualquer incerteza de modelos de Machine Learning em uma ferramenta confiável.

Neste tutorial, pretendo trazer outra utilização relevante das Previsões Conformes, demonstrando detalhadamente, como podemos utilizá-las em modelos de Classificação Binária.

Não confie no “predict_proba()”

Em vez de prever valores de classe diretamente para um problema de classificação, pode ser conveniente prever a probabilidade de uma observação pertencer a cada classe possível.

A previsão de probabilidades permite alguma flexibilidade, incluindo decidir como interpretar as probabilidades, apresentar previsões com incerteza e fornecer maneiras mais sutis de avaliar a habilidade do modelo.

Desejamos que as probabilidades de classe estimadas reflitam a verdadeira probabilidade subjacente da amostra. Ou seja, a probabilidade de classe prevista (ou valor semelhante à probabilidade) precisa ser bem calibrada. Para serem bem calibradas, as probabilidades devem refletir efetivamente a verdadeira probabilidade do evento de interesse.

O objetivo fundamental da resolução de um problema de classificação é permitir uma tomada de decisão inteligente. Imagine um cenário simples de concessão de empréstimo bancário. Você constrói um classificador que diz que um cliente em potencial não ficará inadimplente com o empréstimo.

Esse modelo é útil ? Te provarei que não.

Vamos ao cenário de concessão abaixo, onde 2 modelos com a mesma capacidade preditiva, medida pela Área da Curva ROC (AUC ROC)

Modelos com o mesmo AUC ROC, mas calibração diferente.

Agora, qual dos clientes você aprovaria ?

Ambos os modelos concordam que é mais provável que o cliente seja um bom pagador. Mas, de acordo com a relação risco-retorno, no modelo A, você obterá maior custo esperado ao não conceder o empréstimo. Considerando o modelo B, o custo esperado é maximizado pela concessão do empréstimo.

Em aplicações como esta, em que envolve uma relação de risco-retorno, é vital descobrir qual modelo é capaz de estimar melhores probabilidades calibradas.

Problemas com os métodos conhecidos de calibração

Calibração de modelos de Machine Learning de Classificação Binária. Fonte: https://amueller.github.io/aml/04-model-evaluation/11-calibration.html

Se o leitor é alguém atento à literatura do tema, e conhece bem os modelos de classificação, sabe que já existem dois métodos paramétricos famosos para calibrar probabilidades: Platt Scaling e Isotonic Regression.

Infelizmente, tais métodos já estão bastante desatualizados, além disso, eles sofrem de suposições simplistas, resultando em probabilidades não bem calibradas.

Neste artigo escrito pelo Valery Manokhin, ele aponta alguns problemas, como:

  • Platt Scaling foi projetado especificamente para a distribuição em forma de sigmóide de modelos de SVM;
  • Platt Scaling pode facilmente resultar em estimativas de probabilidade piores do que as pontuações originais e também piorar um classificador perfeitamente calibrado;
  • Isotonic Regression assume a classificação perfeitamente ordenada de objetos pelo classificador no conjunto de teste (o mesmo que dizer ROC AUC = 1);
  • As suposições restritivas da Isotonic Regression geralmente se manifestam em probabilidades mal calibradas e overfitting em pequenos conjuntos de dados;

A solução ? Utilizar as Previsões de Venn-ABERS

Venn-ABERS pertence à classe de Previsão Conforme. E tal como expliquei nos artigos anterior, este tipo de método fornece garantias matemáticas de validade (falta de viés), independentemente da distribuição de dados, tamanho do conjunto de dados e o modelo de classificação utilizado.

Então, como funcionam os métodos de Previsão de Venn-ABERS ?

Como sabemos, os modelos de ML para classificação binária são, na verdade, classificadores de pontuação (score): eles geram uma pontuação de previsão s(x) e a previsão é obtida comparando a pontuação com um limite.

Pode-se aplicar uma função g em s(x) para calibrar as pontuações de modo que g(s(x)) possa ser usado como probabilidade predita. Vamos fazer apenas uma suposição: que g() seja uma função não decrescente.

Vamos tomar como exemplo que g() seja uma Isotonic Regression (IR), um função não decrescente que minimiza a soma dos resíduos quadrados.

Obs: Monotônico (“uma ordem”), seja Isotônico (“preservando a ordem”) ou Antitônico (“contra a ordem”)

Photo by Paolo Toccaceli in Tutorial on Conformal Predictors and Venn Predictors

A IR é constante por partes. Em cada intervalo de s em que g(s) é constante, ela tira a média dos valores dos pontos de treinamento naquele interval. Assim, quando as labels são codificados como 0 e 1, o valor da IR é a frequência relativa do rótulo 1 no intervalo.

Essa característica será útil para utilizar Venn-ABERS. Em virtude que as categorias da taxonomia de Venn são os intervalos nos quais o IR é constante.

Em detalhes, o Previsor de Venn-ABERS funciona da seguinte forma: em vez de construir a Isotonic Regression uma vez, ela é estimada duas vezes, onde cada conjunto de teste assume as labels 0 e 1.

Cada objeto de teste é adicionado ao conjunto de calibração duas vezes, uma vez com rótulo 0 e uma vez com rótulo 1, duas regressões isotônicas são estimadas (g0(x) e g1(x)), resultando em duas probabilidades p0 e p1 para cada objeto de teste.

É importante entender que p0 e p1 são duas probabilidades do objeto pertencente à classe 1. Podemos entender isso como um intervalo de previsão para a probabilidade real da classe 1, com a probabilidade real matematicamente garantida de pertencer a esse intervalo.

Abaixo, temos um exemplo toy das duas IRs utilizadas na previsão de Venn. Nos pontos azuis temos as labels verdadeiras 0 e 1, e nos pontos verdes e vermelhos temos g0(s) e g1(s), respectivamente.

Photo by Paolo Toccaceli in Tutorial on Conformal Predictors and Venn Predictors

Agora, vamos comparar as previsões de Venn com o método de Platt Scaling em dados sintéticos. Na curva preta temos as probabilidades atuais, na curva azul temos a calibração por Platt Scaling, e nas curvas verdes e vermelhos temos g0(s) e g1(s).

A curva com Platt Scaling se mostra pouco precisa e aderente à curva com os dados reais. Já o calibrador Venn-ABERS consegue recuperar a relação pontuação-probabilidade real.

Photo by Paolo Toccaceli in Tutorial on Conformal Predictors and Venn Predictors

Utilizando os mesmos dados, vamos verificar as previsões de Venn-ABERS frente o método de Isotonic Regression (IR). Aqui temos a curva azul representando a calibração por IR.

O IR se ajusta bem aos dados reais, mas suas estimativas de probabilidade não são tão refinadas, o IR possuí apenas 31 níveis de probabilidade diferentes, enquanto que os métodos de Venn-ABERS totalizam 211 para p0, e 1823 para p1.

Photo by Paolo Toccaceli in Tutorial on Conformal Predictors and Venn Predictors

A calibração por Isotonic Regression (IR) é conhecida por “overfitar”. Já os previsores de Venn-ABERS diminuem essa tendência de “overfit”e herdam a garantia de validade dos preditores de Venn.

Comparado com a IR simples, a saída multiprobabilística também fornece uma indicação da confiabilidade das estimativas de probabilidade. Se as probabilidades diferirem, isso pode ser considerado uma indicação da incerteza na própria estimativa de probabilidade.

Em comparação com a Platt Scaling (ajustando um sigmóide como calibrador), os preditores de Venn-ABERS não fazem nenhuma suposição sobre a forma funcional do calibrador.

Até aqui, mostrei como gerar as saídas calibradas g0(s) e g1(s). Uma forma de obter uma saída única, é através de uma função perda que minimize o erro de classificação, como a log loss:

  • log(p) se y=1
  • log(1 — p) se y = 0

E assim, o p = p1/1 — p0 + p1

Abaixo, podemos ver isso de forma mais prática. O gráfico mostra os calibradores de Venn-ABERS sendo utilizado em um modelo de previsão de atividades de compostos, com dados desequilibrados (a classe 1 foi aproximadamente 1%). Esse modelo treinado é um SVM, e nos pontos verdes e vermelhos temos g0(s) e g1(s), respectivamente.

Photo by Paolo Toccaceli in Tutorial on Conformal Predictors and Venn Predictors

Aplicamos a log loss nas calibrações de Venn-ABERS e realizamos uma comparação com a Platt’s Scaling.

Podemos ver que, a Platt’s Scaling (linha azul) é possivelmente menos precisa para altas probabilidades do que a calibração de Venn-ABERS (linha verde).

Calibrando Classificações Binárias na Prática:

Agora, bora pro Python rodar um pequeno exemplo prático.

Um banco (fictício) utiliza ML para obter a probabilidade de inadimplência de seus clientes. Neste caso, vamos prever a probabilidade de alguém passar por dificuldades financeiras nos próximos dois anos.

O conjunto de dados contém 150.000 observações. Cada linha é uma pessoa com variáveis demográficas e de uso de serviços financeiros do banco, além da default/não default que é o target.

Primeiro, vamos fazer o download e importação dos dados. Você pode baixá-los desse repositório ou no próprio Kaggle:

Agora, vamos realizar o pré-processamento dos dados antes de ir para a modelagem.

Em vez de dividir os dados apenas em treinamento e teste, dividimos as 150.000 pessoas em:

  • 100.000 amostras de dados (“X_train”, “y_train”) para treinar o model
  • 10.000 amostras de dados (“X_test”, “y_test”) para avaliar o desempenho do modelo em dados “não vistos” no treinamento
  • 10.000 amostras de dados (“X_calib”, “y_calib”) para calibração (mais sobre isso depois) em dados “não vistos” no treinamento
  • E as 30.000 amostras de dados restantes (“X_new”, “y_new”) ficam de sobra para alguma eventual validação e avaliação futura

Como há colunas com missings, vamos fazer a imputação com base na média dos dados de treino para as variáveis contínuas.

Observando a taxa de eventos, ou seja, a porcentagem de casos de default, vemos que se trata de um target desbalanceado, com aproximadamente 6% a 7% da base.

Treinaremos três modelos de classificação dos defaults dos clientes: LogisticRegression, RandomForest e HistGradientBoosting.

Agora, vamos checar o desempenho preditivo dos modelos.

Os modelos LogisticRegression, RandomForest e HistGradientBoosting classificam corretamente cerca de 94% dos clientes, conforme vemos pela “accuracy”. Parece ótimo, mas vamos lembrar do target desbalanceado da base, então a métrica é enganosa nesse caso, pois pode demonstra uma taxa de acerto maior entre os bons pagodores, ou classe negativa (0).

A Curva PRC surge como uma boa métrica para esse caso, pois ela representa o trade-off entre a taxa de verdadeiro positivo e o valor preditivo positivo usando diferentes limites de probabilidade.

Os modelos LogisticRegression, RandomForest e HistGradientBoosting possuem 0,67, 0,84 e 0,87 na área da Curva ROC, respectivamente. E na Curva PRC, os modelos LogisticRegression, RandomForest e HistGradientBoosting possuem as áreas 0,15, 0,35 e 0,40, respectivamente. Onde o HistGradientBoosting possui a melhor taxa de acerto da classe positiva (1).

Estes modelos infelizmente não são bons, e com certeza podem ser melhorados, mas vamos supor, que por questões de limitação, o modelo não pode ser reestimado. Então precisamos de uma solução que garanta que as saídas (probabilidades preditas) dos modelos sejam confiáveis.

Lembrando do caso dos feijões dos artigos anteriores, isso foi realizado através das garantias de cobertura. Mas foi um caso em que era mais importante o acerto da classe em si, do que necessariamente da probabilidade. Aqui vamos realizar a calibração do “predict_proba” dos modelos.

Previsão Conforme ainda é um assunto “hipster”, e não há grandes bibliotecas no “mainstream”. Vamos importar esse código antigo aqui para implementar o método de Venn-ABERS: https://github.com/ptocca/VennABERS.

Se você conhecer algum outro código que implemente este método. Por favor entre em contato comigo.

O código abaixo consiste em:

  • 1) Obter as “probabilidades” do modelo (“predict_proba”) no conjunto de calibração (“X_calib”, “y_calib”)
  • 2) Gerar uma lista de pares (score, label) correspondentes aos scores do “predict_proba” e as labels originais da amostra de calibração.
  • 3) O modelo de Venn-ABERS “aprende” a calibrar no conjunto de calibração, e compara a saída de pontuação pelo modelo de aprendizado de máquina subjacente e comparando-os com rótulos de classe no conjunto de calibração
  • 4) Por fim, obter a log-loss das previsões de Venn-ABERS (“p0”, “p1”)

Para finalizar, vamos comparar o score gerado pela log-loss das previsões de Venn-ABERS (“p0”, “p1”) com o score gerado pré-calibração do “predict_proba”. A sequência de códigos abaixo irá agrupar ambos scores por percentis (aqui usarei decis), e vamos calcular a taxa de default acumulada para cada faixa de 1 à 10.

Afinal, uma probabilidade predita bem calibarada, de digamos, >=0,90 deveria ter frequência acumulada verdadeira de ter pelo menos 90% dos maus pagadores.

Para começar, vamos criar a função abaixo para gerar as frequências de acordo com os percentis do score.

Agora, aplicamos a função nos scores pré e pós calibração. Na coluna “cumsum_event_rate, armazenamos a porcentagem cumulativa do nosso evento de interesse, os maus pagadores, por cada faixa de quantil.

E por fim, vamos comparar graficamente com um diagrama de calibração/confiabilidade (“realiability”). São maneiras de ilustrar as propriedades das previsões probabilísticas. Eles consistem em um gráfico da frequência relativa observada contra a probabilidade prevista, fornecendo uma comparação visual da capacidade de calibração do modelo.

Podemos ver que, para os três modelos, a Uncalibrated Score (linha preta) é possivelmente menos precisa do que a calibração de Venn-ABERS (linha azul). Nota-se uma grande distância entre os decis nas altas probabilidades.

Neste gráfico há alguns pontos que ficam acima e abaixo da linha diagonal. Onde quem fica abaixo da diagonal mostra que modelo está superestimado, as probabilidades são muito grandes. E acima da diagonal, o modelo está subestimado; as probabilidades são muito pequenas.

Antes da calibração, os três modelos superestimam demais as probabilidades, uma vez que todos os seus pontos estão abaixo da linha diagonal. A calibração consegue dar uma “corrigida” e trazer as probabilidades para onde a diagonal se encontra.

Medindo Calibração com Expected Calibrator Error (ECE):

Muito interessante ver visualmente, como as previsões conformes de Venn-ABERS calibram muito bem os resultados dos modelos. Mas, e se quisermos escolher um modelo dentre os três que rodamos para por em produção ? Não seria melhor ter alguma métrica para isso ? Pois verificar à olho nu pode ser contraproducente e gerar erros humanos.

O “Expected Calibrator Error” ou Erro Esperado do Calibrador (ECE) é uma estatística resumida comumente usada que mede a diferença entre a probabilidade esperada e a fração de positivos. Onde n é o número total de amostras. Aqui, o erro de calibração esperado é medido pelo RMSE (Root Mean Squared Error) entre prob(Bm) e pos(Bm).

Obs: Se quisermos ter uma métrica menos sensível a outliers, também podemos mudar para MAE (Mean Absolute Error).

Fonte: http://ethen8181.github.io/machine-learning/model_selection/prob_calibration/prob_calibration.html

Valores pequenos de ECE indicam um modelo bem calibrado; valores maiores de ECE indicam um modelo menos bem calibrado.

Como o artigo ficou muito longo até aqui, sugiro ao leitor calcular a métrica por sua conta e ir testando a previsão conforme de Venn-ABERS como uma maneira legal de calibrar seus modelos.

Obs: Para calcular a métrica, recomendo utilizar as funções desenvolvidas nesse repositório: https://github.com/ethen8181/machine-learning/, dentro do sub-diretório “machine-learning/model_selection/prob_calibration/”.

Considerações Finais:

Venn-ABERS é um excelente calibrador para classificadores de todos os tipos. Seja para dados tabulares, para visão computacional ou NLP (sim, os famosos Transformers também estão mal calibrados).

Complementar uma previsão com sua probabilidade calibrada pode permitir uma melhor tomada de decisão, já que possuem garantias de validade. Esse tipo de previsor não assume uma forma funcional (por exemplo, sigmóide) e nem suposição de distribuição para a relação entre pontuação e probabilidade, o que facilita aplicar o modelo em qualquer modelo de Machine Learning.

E esse tipo de técnica se estende em diferentes situações que envolvem Machine Learning além de Classificação Binária, como Multiclass, Regressão e Séries Temporais. Portanto, fiquem atentos para os próximos artigos.

Notas:

Quaisquer erros são de minha autoria. Fiquem à vontade para dar feedbacks e críticas construtivas.

Referências:

https://machinelearningmastery.com/calibrated-classification-model-in-scikit-learn/

Tutorial on Conformal Predictors and Venn Predictors: https://cml.rhul.ac.uk/people/ptocca/HomePage/Toccaceli_CP___Venn_Tutorial.pdf

--

--