O mesmo modelo, três decisões
Antes da teoria, o resultado. Mesmos 10.000 clientes, mesmo modelo, mesma AUC de —. Três maneiras de usar o score, com ligação a R$ 8 e margem de R$ 120 por venda:
| Estratégia | Ligações | Vendas | Lucro | − 0 + |
|---|
—
O resto desta entrada explica essa conta, mostra onde ela funciona e, principalmente, onde ela quebra.
De onde veio
Um aluno chegou com um projeto que, no papel, estava pronto. Tinha as etapas que todo curso ensina (dados, preparação, modelo, deploy) e uma a mais, que quase ninguém desenha no diagrama: uma pasta chamada POLICY.
O modelo estimava a propensão de compra de cada cliente. A pasta de política transformava essa estimativa em ação: faixas de propensão, um corte, a lista de quem recebe a oferta. A decisão de negócio morava ali, e não no modelo. Os números dele não aparecem aqui; o problema é o mesmo, remontado com dados sintéticos.
A versão física do problema
Antes de qualquer curva ROC, uma ordem de grandeza. Dez mil clientes, taxa de compra de 6%: umas 600 pessoas que vão comprar, espalhadas na base. Cada contato custa C; cada venda deixa V de margem (o que sobra depois do custo do produto, impostos, comissão e desconto, não o preço).
Ligar para um cliente com probabilidade p de comprar tem valor esperado p·V − C. Vale a pena quando isso é positivo:
É teoria de decisão clássica, na formulação que virou referência em machine learning com Elkan (2001): se não ligar custa zero, o corte ótimo é a razão C/V. Com R$ 8 e R$ 120, t* ≈ 0,067. Não é 0,5. Também não é, em geral, o ponto de Youden nem outro ponto "bonito" da curva ROC. Com score calibrado, o ponto de Youden equivale a cortar na taxa base: ele embute uma razão de custos que só coincide com a sua por acaso. Aqui, por acaso, quase coincide (a taxa base é 6,4% e C/V é 6,7%); mude V na bancada e veja os dois se separarem. (O ponto da ROC ponderado por custo, esse sim, leva ao mesmo t*.)
Ligue para quem tem chance de comprar maior do que o custo da ligação dividido pelo que a venda rende. Ligação de R$ 8, venda de R$ 120: ligue para quem tem mais de 1 chance em 15.
A conta tem duas condições escondidas. A primeira: p precisa ser uma probabilidade de verdade. A segunda: quem não recebe a ligação não compra sozinho. Guarde as duas, porque é por elas que o dinheiro vaza.
Bancada 1 · Escolha o corte
score calibrado · AUC ——
| Compraria com a ligação | Não compraria | |
|---|---|---|
| Recebeu ligação | —venda que pagou a ligação | —ligação desperdiçada |
| Não recebeu | —comprador que ficou abaixo da linha (só dá para ver porque o dado é sintético) | —economia correta |
Ver os números em tabela
Onde está o dinheiro
1. Parar de pagar ligação que não se paga
Da estratégia "ligar para todo mundo" para a regra C/V, a campanha faz — ligações a menos e o lucro vai de — para —. As ligações evitadas economizam —; no caminho se perdem — vendas que, somadas, custavam em ligações mais do que rendiam. Nenhuma venda nova foi inventada: o ganho vem de parar de pagar por quem estava abaixo de C/V.
O corte padrão de 0,5 erra para o outro lado. Com esta base, —. Pela equação (1), 0,5 só seria o ótimo se a venda valesse exatamente o dobro da ligação (V = 2C); aqui ela vale 15 vezes. O erro é de custo, herdado do default da biblioteca. A própria documentação do scikit-learn avisa que esse corte fixo quase nunca é o ideal.
O primeiro dinheiro que um modelo traz é o que você para de gastar. O segundo é o que você deixa de perder por excesso de cautela.
2. Mesma equipe, mais vendas
Com capacidade fixa, a pergunta muda de "quem vale a pena" para "quem vale mais a pena". O corte vira uma posição na fila, e o que decide quem entra é a qualidade da ordenação no topo da lista (a precisão nas primeiras 1.000 posições, que é o que define o lift), não a AUC da base inteira. A calibração continua dizendo se vale encher a fila.
Vendas com 1.000 ligações. Lift: —. Mude a capacidade na Bancada 1 e estas barras acompanham.
—
3. A régua é de negócio, não de TI
O corte ótimo é função de C e V, não do modelo. Mexa nos controles de C e V da Bancada 1 e veja a zona verde andar sem que o modelo mude uma vírgula. Quando a margem do produto muda, ou o custo da equipe muda, a lista tem que mudar junto. Experimente C = 40 e V = 80, ou qualquer par com V = 2C: é o único tipo de mundo em que a equação (1) manda cortar em 0,5. E repare no que a bancada mostra nesse caso: nesta base quase ninguém tem score acima de 0,5, então nem o corte certo salva uma campanha que não tem para quem ligar.
Se ninguém na empresa é dono desse corte, ninguém está gerindo o modelo. Está só rodando.
Onde isso quebra (e o dinheiro vaza)
Score não é probabilidade
A equação (1) assume que um score de 0,10 quer dizer 10% de chance. Nem todo modelo entrega isso. Niculescu-Mizil e Caruana mostraram que métodos de margem máxima, como árvores com boosting do tipo AdaBoost e SVMs, empurram as probabilidades para longe de 0 e de 1, numa distorção em forma de sigmoide. (Os gradient boostings de hoje, treinados com log-loss, costumam sair menos distorcidos.) O que mais desloca a escala na prática é rebalancear as classes no treino, por amostragem ou por pesos. Na Bancada 2, o modelo descalibrado tem a mesma ordenação, a mesma AUC e o mesmo lucro máximo possível, e mesmo assim a regra aplicada a ele cai no lugar errado.
Termoscópio não é termômetro
Entre o fim do século XVI e o começo do XVII, Galileu e outros construíram termoscópios: instrumentos que mostravam se uma coisa estava mais quente que outra, mas não quantos graus. O termoscópio só virou termômetro de verdade, com leituras comparáveis de um instrumento para outro, quando a escala foi amarrada a pontos fixos reprodutíveis, como a de Rømer, em 1701, e depois a de Fahrenheit.
Um modelo com AUC alta e sem calibração é um termoscópio. A AUC é invariante a qualquer transformação estritamente crescente do score: eleve o score a 0,6, passe numa sigmoide, tire a raiz, e ela não se mexe. A equação (1) se mexe inteira. Ordenação e escala são grandezas diferentes, e a decisão depende da escala.
O conserto é conhecido: calibrar num conjunto separado e rotulado antes de usar qualquer regra de valor esperado. O Platt scaling funciona bem quando a distorção tem forma de sigmoide. A regressão isotônica corrige qualquer distorção monotônica, mas precisa de mais dados e sobreajusta com poucos positivos. Nenhuma das duas resolve drift. Existe também um atalho: com C e V fixos, dá para escolher o corte direto no score, maximizando o lucro numa amostra rotulada separada (é o que faz o TunedThresholdClassifierCV do scikit-learn). A calibração vira indispensável quando V muda de cliente para cliente ou quando a régua muda com frequência.
O modelo sabe quem está mais quente, mas não sabe quantos graus. Para decidir se vale a ligação, você precisa dos graus.
O mundo muda depois do deploy
Se no mês seguinte a taxa de compra cai 40% por sazonalidade, o score continua igual, mas um score de 0,10 passa a significar 6% de chance. O modelo deixou de ser calibrado sem mudar uma vírgula. O corte em probabilidade continua sendo C/V; o corte no score precisava subir e ficou congelado no dia 0. Para esse caso específico, mudança na taxa base, existe um ajuste clássico: corrigir as odds pela nova prevalência (Saerens e colegas, 2002). Ele vale quando só a proporção de compradores muda e o perfil de cada grupo fica igual, e a nova taxa precisa ser medida: o grupo sorteado da seção seguinte serve para isso. Veja o cenário "Drift" na Bancada 2.
Em dezembro todo mundo compra; em fevereiro, não. Se a régua de dezembro continua valendo em fevereiro, você paga ligação para quem não vai comprar.
Você só vê o que decidiu ver
Depois do deploy, só existe resposta à ligação para quem recebeu a ligação. No corte atual da Bancada 1, — clientes que comprariam se recebessem a ligação ficaram abaixo da linha, e nos dados de produção ninguém sabe como eles teriam respondido. Retreinar com esses dados é aprender sobre um recorte que o próprio corte escolheu, e até o monitoramento da calibração herda esse viés. Na literatura, isso tem nome: o problema dos rótulos seletivos.
O LHC também tem equipe limitada
No LHC, os feixes se cruzam 40 milhões de vezes por segundo, e cada cruzamento traz dezenas de colisões. Não dá para guardar tudo. No ATLAS, o primeiro nível do trigger reduz o fluxo a 100 mil eventos por segundo, e o segundo deixa uns 3 mil por segundo para análise. É um threshold com capacidade fixa, igual ao da sua equipe de vendas, e com o mesmo problema: o que o trigger descarta não existe para a análise.
Uma das saídas dos físicos é gravar, de propósito, uma fração do que o filtro principal descartaria: cruzamentos de feixes sorteados ao acaso e triggers mais frouxos com prescale, que guardam 1 em cada N eventos. Essa amostra vira o controle que mede o que o filtro está perdendo. O ATLAS, por exemplo, usou cruzamentos de feixes sorteados como controle para medir a eficiência do seu trigger de minimum bias.
A tradução para o marketing é direta: ligar para uma amostra aleatória, pequena, também abaixo do corte. Custa pouco e mantém o modelo honesto. Se o sorteio for completo, deixando também uma parte dos clientes acima do corte sem ligação, o mesmo desenho passa a medir o efeito real da ligação.
Nem o maior acelerador de partículas do mundo consegue guardar tudo o que vê. Por isso ele separa uma amostra ao acaso, para saber o que está perdendo. Sua campanha também deveria.
Propensão não é efeito da ligação
O modelo prevê quem compra, não quem compra por causa da ligação. O cliente que compraria de qualquer jeito tem score alto e consome contato à toa. Esta é a segunda condição da equação (1): o p certo ali é a diferença entre a chance de comprar com ligação e sem ligação. Para essa pergunta, a ferramenta é outra: modelos de uplift, que estimam o impacto incremental da ação e pedem contato aleatorizado para ser treinados com confiança.
Gastar ligação, ou desconto, com quem ia comprar de qualquer jeito não é venda, é doação. O cliente que vale ouro é o que só compra se você ligar.
Bancada 2 · Onde quebra
usa C e V da Bancada 1 · sem limite de capacidade—
Ver os números em tabela
Para reproduzir
Os mesmos passos da Bancada 1, em Python. Os números saem diferentes dos da página, porque o gerador aleatório é outro (de uma semente para outra, variam alguns milhares de reais); as conclusões, não.
import numpy as np
rng = np.random.default_rng(7)
N, C, V = 10_000, 8, 120 # clientes, custo por ligação, valor por venda
score = rng.beta(0.8, 12, N) # score calibrado por construção
buyer = rng.random(N) < score # quem compra de fato
def profit(t, capacity=None):
order = np.argsort(-score)
chosen = order[score[order] >= t][:capacity]
return buyer[chosen].sum() * V - len(chosen) * C
grid = np.arange(0, 0.5, 0.005)
best = grid[np.argmax([profit(t) for t in grid])]
print(f"regra C/V = {C/V:.3f} | melhor empírico = {best:.3f}")
print(f"todo mundo = {profit(0)} | corte 0.5 = {profit(0.5)} | regra = {profit(C/V)}")
print(f"na regra, com 1.000 ligações = {profit(C/V, 1000)}")
Referências
Decisão e custo
- Elkan, C. (2001). The Foundations of Cost-Sensitive Learning. IJCAI.A formulação clássica, em ML, da equação (1): o corte ótimo como razão de custos.
- Provost, F. & Fawcett, T. (2013). Data Science for Business. O'Reilly.O arcabouço de valor esperado para decisões de marketing, escrito também para gestores.
- scikit-learn: Tuning the decision threshold for class prediction.A documentação que avisa que o corte fixo em 0,5 quase nunca é o ideal.
- Wikipedia: Youden's J statistic.O ponto "bonito" da ROC, que embute uma razão de custos que não é a sua.
Calibração e drift
- Niculescu-Mizil, A. & Caruana, R. (2005). Predicting Good Probabilities With Supervised Learning. ICML.Quais modelos saem descalibrados e quando usar Platt ou isotônica.
- scikit-learn: Probability calibration.Curvas de calibração e os dois métodos, na prática.
- Saerens, M., Latinne, P. & Decaestecker, C. (2002). Adjusting the Outputs of a Classifier to New a Priori Probabilities: A Simple Procedure. Neural Computation, 14(1).Como corrigir probabilidades quando a taxa base muda, se o perfil de cada classe não muda.
O que o corte esconde
- Lakkaraju, H. et al. (2017). The Selective Labels Problem: Evaluating Algorithmic Predictions in the Presence of Unobservables. KDD.Por que avaliar decisões só com os casos que passaram pelo filtro engana. O caso principal são decisões de fiança tomadas por juízes; o mecanismo é o mesmo.
- Gutierrez, P. & Gérardy, J.-Y. (2017). Causal Inference and Uplift Modelling: A Review of the Literature. PMLR 67.Modelar o impacto incremental da ação, não a propensão.
Viagens
- ATLAS Experiment (2022). ATLAS Event Selection System Readies for LHC Run 3.Os números do trigger citados acima.
- Tompkins, L., for the ATLAS Collaboration (2010). Performance of the ATLAS Minimum Bias Trigger in p-p collisions at the LHC. HCP2010.Anais de conferência. Cruzamentos de feixes sorteados como controle do trigger.
- Wikipedia: Thermoscope.Do termoscópio ao termômetro.
Tem um problema desses na sua empresa?
Dentro de empresas, eu faço isso pela Vettore Data, a minha consultoria: olhamos o seu modelo, o custo do seu erro e a capacidade do seu time, e dizemos qual corte usar e quanto dinheiro está na mesa. A versão para quem decide está nos Insights da Vettore.
Ler a versão para quem decideou fale comigo