Uma Introdução Prática à Previsão Conforme

Tutorial explicando como utilizar as Previsões Conformes (Conformal Predictions) para quantificar incertezas em modelos de Machine Learning.

Gustavo Bruschi
Data Hackers
12 min readApr 19, 2023

--

Photo by Markus Spiske in Unsplash

Modelos de Machine Learning são incertos e inconfiáveis

https://www.forbes.com/sites/margiewarrell/2020/10/23/leading-change-start-treating-uncertainty-as-the-new-normal/?sh=17415d7c3898

O cientista de dados DIARIAMENTE se pergunta se o modelo de Machine Learning que treinou têm previsões confiáveis.

Isso ocorre porque todos os passos de construção de um modelo geram uma cadeia de incertezas, como por exemplo:

  • Amostragem aleatória dos dados: o treinamento de diferentes amostras de uma mesma população pode gerar modelos com resultados diferentes.
  • Modelos de característica não determinística: alguns modelos possuem parâmetros aleatórios, como a inicialização de pesos em redes neurais, e mecanismos de amostragem em random forests.
  • Feature selection, model selection, e hyperparameter tuning: são etapas do pipeline de modelagem que envolvem estimação baseada em amostras aleatórias dos dados, o que aumenta a incerteza do processo de modelagem.

Obviamente há mais fontes de incertezas, mas os citados acima estão dentre alguns bons exemplos sobre desafios que o cientista de dados encara.

O que é Predição Conforme ? E como ela nos ajuda ?

https://mindfulmodeler.substack.com/p/e-mail-course-on-conformal-prediction

Previsão Conforme (em inglês Conformal Prediction) é um método que transforma as previsões pontuais em conjuntos de previsões. Dessa forma, fornece previsões associadas à um nível de confiança estatística, permitindo que sejam medidos e controlados os riscos de uma previsão estar errada.

Afinal, sem isso, uma previsão correta e um “chute” podem parecer a mesma coisa.

Os pioneiros da ideia de Previsão Conforme foram os pesquisadores Vladimir Vovk e Glenn Shafer, que buscavam criar uma maneira de fornecer confiabilidade nas previsões dos modelos de Machine Learning. O livro Algorithmic Learning in a Random World valida suas teorias através de demonstrações matemáticas e experimentos.

Vladimir Vovk e Glenn Shafer

E um extra, na comunidade de Data Science, o Valeriy Manokhin têm sido o principal evangelista da ideia, sigam seu maravilhoso repositório sobre o tema: https://github.com/valeman/awesome-conformal-prediction.

Mas você deve estar se perguntando: “Existem muitos modelos já possuem formas de quantificar as incertezas, como probabilidades em classificações, intervalos posteriores bayesianos e métodos de boostrapping. Porquê eu utilizaria as previsões conformes ?”

Infelizmente, os métodos citados possuem alguns problemas que a previsão conforme consegue solucionar:

  • No caso das probabilidades em classificações, não devemos interpretar essas pontuações como probabilidades reais, pois geralmente não são calibradas. As pontuações de probabilidade são calibradas se, por exemplo, entre todas as classificações com pontuação de 90%, encontramos a verdadeira classe 9 em 10 vezes.
  • Nos intervalos de confiança gerados por posteriores bayesianos, é necessário se prender à suposições de distribuição para os anteriores (priors), o que pode não capturar muitos aspectos da realidade.
  • E no caso do bootstrapping, a reestimação do modelo com dados amostrados pode subestimar a variância real, gerando intervalos de confiança estreitos.

A predição conforme têm vantagens comparadas aos demais métodos de quantificação de incerteza:

  • Cobertura garantida: as regiões da previsão gerada vêm com garantias de cobertura do resultado verdadeiro
  • Agnóstica ao Modelo: funciona com qualquer técnica de Machine Learning
  • Livre de Distribuição: predições conformes não possuem suposição de distribuição de probabilidade
  • Sem retreino necessário: não há necessidade de reestimar o modelo utilizado
  • Várias aplicações: funciona para modelos de classificação, regressão, forecast de séries temporais, dentre outros

Como posso utilizar a Previsão Conforme ?

Quantificar a incerteza é essencial em muitas situações, desde: tomar decisões (automatizadas ou não) com o modelo de ML; desenhar sistemas robustos, que lidam com situações inesperadas; quando há necessidade de saber quando o humano deve intervir numa tarefa automatizada; e até comunicar incerteza associada às previsões para os stakeholders.

Nas últimas semanas estudei o tema Predição Conforme pelo excelente livro “Introduction To Conformal Prediction With Python” do Christoph Molnar e ele apresenta alguns casos práticos interessantes de uso desse método:

  • Detecção de Fraude: uma seguradora avalia fraudes em sinistros, e classifica os casos mais potencialmente fraudulentos. Aqui, os analistas de fraude podem utilizar as estimativas de incerteza para priorizar a revisão dos sinistros e intervir quando necessário.
  • Experiência do Usuário: imagine um app bancário que classifica as transações, em digamos, “supermercado” e “boleto de aluguel”, via um modelo de ML automatizado. Sempre haverá casos de transações difíceis de classificar. Dessa forma as previsões conformes podem ser úteis para identificar casos em que o próprio usuário pode preencher manualmente esses casos duvidosos por um pequeno prompt.
  • Previsão de Demanda: o uso de ML em previsão de demanda pode ser melhorado com a adição dos intervalos de confiança da Previsão Conforme, gerando contexto adicional para tomada de decisão. Isso é importante em situações em que a demanda deve atender a um determinado limite para justificar a produção. Ao entender a incerteza da previsão, empresas podem tomar decisões mais informadas sobre prosseguir com a produção.

Classificando feijões com Predição Conforme

Vou me basear novamente no livro “Introduction To Conformal Prediction With Python” do Christoph Molnar e utilizar a Previsão Conforme em um problema de classificação multiclass.

Essa sessão do artigo será um pouco maior que as demais, mas importante para demonstrar que a Previsão Conforme é um conjunto de métodos que pega uma pontuação de incerteza e a transforma em uma pontuação rigorosa. “Rigoroso” significa que a saída tem garantias probabilísticas de que cobre o resultado verdadeiro.

Photo by Christoph Molnar in Introduction To Conformal Prediction

Vamos ao caso. Uma empresa (fictícia) de feijão usa ML para classificar automaticamente grãos de feijão em 1 de 7 variedades diferentes: Barbunya, Bombay, Cali, Dermason, Horoz, Seker e Sira. O conjunto de dados contém 13.611 feijões. Cada linha é um grão seco com 8 medidas como comprimento, redondeza e solidez, além da variedade que é o target.

As diferentes variedades têm características diferentes, por isso faz sentido classificá-las e vender o feijão por variedade. Plantar a variedade certa é importante por razões de rendimento e proteção contra doenças.

Automatizar essa tarefa de classificação com aprendizado de máquina libera muito tempo que, de outra forma, seria gasto fazendo isso manualmente.

Primeiro, vamos fazer o download e importação dos dados:

O modelo de classificação dos feijões foi treinado por um ex-colaborador (fictício) que deixou a companhia há muito tempo. É um modelo Naive Bayes. Este é o código dele:

Em vez de dividir os dados apenas em treinamento e teste, dividimos os 13.611 feijões em:

  • 10.000 amostras de dados (“X_train”, “y_train”) para treinar o model
  • 1.000 amostras de dados (“X_test”, “y_test”) para avaliar o desempenho do modelo em dados “não vistos” no treinamento
  • 1.000 amostras de dados (“X_calib”, “y_calib”) para calibração (mais sobre isso depois) em dados “não vistos” no treinamento
  • As 1.611 amostras de dados restantes (“X_new”, “y_new”) para a etapa de previsão conforme e para sua avaliação(mais sobre isso posteriormente)

O sujeito nem se preocupou em ajustar hiperparâmetros ou fazer seleção de modelo. Bem, vamos dar uma olhada no desempenho preditivo:

75,80% dos feijões nos dados de teste são classificados corretamente. Como ler esta matriz de confusão: as linhas indicam as classes verdadeiras e as colunas as classes previstas. Por exemplo, 47 feijões “Barbunya” foram erroneamente classificados como “Cali”. As classes parecem ter diferentes dificuldades de classificação, por exemplo, “Bombay” é sempre classificado corretamente nos dados do teste, mas “Barbunya” apenas metade do tempo.

Este infelizmente não é bom modelo, e por questões de limitação tecnológica e legado, o modelo não pode ser trocado com facilidade. Não seria fácil mexer nesse complexo quebra-cabeça que é o back-end da empresa de feijões.

E para piorar, a empresa está com problemas. Vários clientes reclamaram que compraram sacos de um tipo de variedade, mas havia muitos grãos de outras variedades misturados.

O CEO faz uma reunião de emergência e fica decidido que oferecerá produtos premium com percentual garantido para a variedade de feijão anunciada. Por exemplo, um saco rotulado como “Seker” deve ter pelo menos 95% de grãos “Seker”.

Como podemos ver, classificar os feijões pode ser uma tarefa bem complexa (só conheço feijão marrom e pretinho/carioca). Tanto à olho nu, e mesmo para modelos de Machine Learning. Photo by A.Aladdin in Kaggle Notebook

Ótimo, agora toda a pressão está sobre o cientista de dados para fornecer essas garantias (todas baseadas nesse modelo ruim). Sua primeira abordagem é a “abordagem ingênua” da incerteza, o que significa pegar as saídas de probabilidade e acreditar nelas. Então, em vez de apenas usar a classe, ela pega a pontuação de probabilidade prevista e, se essa pontuação estiver acima de 95%, o feijão entra na bolsa de 95%.

Ainda não está claro o que fazer com o feijão que não dá conta de nenhuma das turmas, mas o ensopado parece ser a opção mais procurada pelos funcionários. O cientista de dados não confia totalmente nas pontuações do modelo, então ele verifica a cobertura da abordagem ingênua. Felizmente, ela tem acesso a novos dados rotulados que pode usar para estimar o desempenho de sua abordagem.

Ela obtém as previsões de probabilidade para os novos dados, mantém apenas os feijões com probabilidade predita >=0,95 e verifica com que frequência a verdade absoluta está realmente naquele saco de 95%.

Idealmente, 95% ou mais dos grãos deveriam ter a classe prevista, mas ela descobre que a sacola de 95% contém apenas 89,6% da variedade correta.

O que fazer agora?

O cientista de dados decide pensar sobre o problema de uma maneira diferente: ela não começa com as pontuações de probabilidade, mas como pode obter uma garantia de cobertura de 95%.

Ela pode produzir um conjunto de previsões para cada feijão que cubra a verdadeira classe com 95% de probabilidade? Parece ser uma questão de encontrar o limite certo. Então ela faz o seguinte:

Ela ignora que a saída pode ser uma probabilidade. Em vez disso, ela usa o modelo de “probabilidades” para construir uma medida de incerteza:

𝑠𝑖 = 1 — 𝑓(𝑥𝑖)[𝑦𝑖]

Na linguagem de previsão conforme, essa pontuação 𝑠𝑖 é chamada de Score de Não-Conformidade, que mede o quão incomum um resultado sugerido 𝑦 aparece dado a saída do modelo para 𝑥𝑖. Para decidir quais y são “conformes”, e formar a região de previsão, que é um limite baseado nas pontuações de não-conformidade dos dados de calibração em combinação com as labels verdadeiras.

Por exemplo, se a verdade fundamental para o feijão número 8 for “Seker” e a pontuação de probabilidade para Seker for 0,9, então 𝑠8 = 0,1.

Para encontrar esse limite, é feito o seguinte procedimento:

  1. Comece com dados não usados para treinamento do modelo
  2. Calcule as pontuações 𝑠𝑖
  3. Classifique as pontuações de baixa (certa) a alta (incerta)
  4. Calcule o limite q onde 95% dos 𝑠𝑖 são menores (= 95% quantil)

O código acima calcula esses limites e também o ponto de corte.

O nível quantil (baseado em 𝛼) requer uma correção de amostra finita para calcular o quantil correspondente. Nesse caso, o 0,95 foi multiplicado por (n+1)/n , o que significa que 𝑞𝑙𝑒𝑣𝑒𝑙 = 0,951 para n = 1000.

E ao final do código, se visualizarmos as pontuações, veremos que é uma questão de cortar na posição correta, conforme mostrado no histograma abaixo.

Para a figura acima, cortaríamos tudo acima 𝑞 = 0,99906, pois para pontuações de feijão 𝑠𝑖 abaixo desse limiar (equivalente a “probabilidades” de classe > 0,001), podemos ter certeza de que incluímos a classe certa 95% das vezes.

Para incluir a classe certa 95% das vezes, seria necessário cortar tudo acima de 𝑞 = 0,99906.

Mas há um problema: para alguns pontos de dados, haverá mais de uma classe que fará o corte. Mas os conjuntos de previsão não são um bug, eles são um recurso da Previsão Conforme.

Para gerar os conjuntos de previsão para um novo ponto de dados, o cientista de dados deve combinar todas as classes que estão abaixo do limite 𝑞 em um conjunto.

Abaixo, listamos os conjuntos de previsão para 3 “novos” feijões (X_new):

Em média, os conjuntos de previsão cobrem a verdadeira classe com uma probabilidade de 95%. Essa é a garantia que obtemos do procedimento conforme.

Como a empresa de feijão poderia trabalhar com tais conjuntos de previsões? O primeiro conjunto tem apenas 1 variedade de feijão “Dermason”, então caberia em um saco Dermason. Já os feijões #3 tem um conjunto de previsões com duas variedades.

Quem sabe uma chance de oferecer produtos de feijão com cobertura garantida, mas contendo duas variedades ? Qualquer coisa com mais categorias poderia ser classificada manualmente, ou o CEO poderia finalmente fazer um ensopado de feijão para todos.

O CEO agora está mais relaxado e confiante no produto. Missão cumprida até aqui.

Spoiler: Missão cumprida até aqui, pois ainda há mais coisas para explorar, e o CEO não deveria ficar tão confiante.

Classificando feijões com MAPIE

Existem libs para lidar com o problema da companhia de feijões, como a MAPIE, voltada para realizar Previsões Conformes.

A MAPIE funciona como um wrapper em torno de nosso modelo original.

A Previsão Conforme é um wrapper do modelo original. Photo by Christoph Molnar in Introduction To Conformal Prediction

Não estamos mais trabalhando com o objeto modelo NaiveBayes, mas nosso modelo agora é um objeto MapieClassifier. Se você estiver familiarizado com a biblioteca sklearn, será natural trabalhar com objetos no MAPIE, pois possuem funções .fit e .predict(), assim como os modelos sklearn.

E quando usamos o método “predict” deste classificador conforme, obtemos a previsão usual (“y_pred”) e os conjuntos da previsão conforme (“y_set”).

É possível especificar mais de um valor para 𝛼. Mas no código acima apenas 1 valor foi especificado, então o “y_set” resultante é uma matriz de forma (1000, 7, 1), o que significa 1000 pontos de dados, 7 classes e 1 𝛼. A função np.squeeze remove a última dimensão.

Vamos dar uma olhada em alguns dos conjuntos de previsão resultantes. Como o cp_score contém apenas “True” e “False” nos índices de classe correspondentes, temos que usar os rótulos de classe para obter resultados legíveis.

Para os 5 primeiros conjuntos de previsões para os feijões, abaixo vemos que são de tamanho 1 ou 2.

Observando os demais feijões em X_new, a maioria dos conjuntos tem tamanho 1 ou 2, muitos poucos têm 3 variedades, e apenas um conjunto tem 4 variedades de feijão.

Isso parece diferente se tornarmos 𝛼 pequeno, dizendo que queremos uma alta probabilidade de que a classe verdadeira esteja lá.

Como esperado, obtemos conjuntos maiores com um valor menor para 𝛼. Isso ocorre porque quanto menor o 𝛼, mais frequentemente os conjuntos precisam cobrir o parâmetro verdadeiro. Então já podemos ver que existe um trade-off entre o tamanho do conjunto e a cobertura.

Pagamos por uma cobertura maior com conjuntos de tamanhos maiores. É por isso que 100% de cobertura (𝛼 = 0) produziria uma solução estúpida: incluiria apenas todas as variedades de feijão em cada conjunto para cada feijão.

Se quisermos ver os resultados em diferentes 𝛼, podemos passar uma lista de valores de diferentes níveis de confiança, e o MAPIE calculará automaticamente os conjuntos (ex: alpha=[0.1, 0.05, 0.01])

Agora, vamos criar um Pandas DataFrame para armazenar nossos resultados.

Trabalhar com predição conforme e MAPIE é uma ótima experiência.

Mas os resultados são realmente o que a empresa de feijão estava procurando ? Outro spoiler: já te adianto que não. Para não deixar esse artigo uma bíblia, ainda escreverei um artigo mais focado em Previsão Conforme para o caso de Classificação, e veremos a importância da garantia de cobertura do preditor.

Considerações Finais:

Presumo que se o leitor chegou até aqui, com certeza tem interesse em conhecer mais sobre o potencial da Previsão Conforme. É um método versátil que pode transformar qualquer outro método de incerteza em uma ferramenta confiável.

Esse tipo de técnica pode ser aplicado em diferentes situações que envolvem Machine Learning além de Classificação, como Regressão e Séries Temporais. 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:

--

--