Lo stesso modello, tre decisioni
Prima della teoria, il risultato. Stessi 10.000 clienti, stesso modello, stessa AUC di —. Tre modi di usare lo score, con una chiamata che costa 8 € e un margine di 120 € per vendita:
| Strategia | Chiamate | Vendite | Profitto | − 0 + |
|---|
—
Il resto di questa pagina spiega il conto, mostra dove funziona e, soprattutto, dove cede.
Da dove nasce
Un allievo è arrivato con un progetto che, sulla carta, era pronto. Aveva le fasi che ogni corso insegna (dati, preparazione, modello, deploy) e una in più, che quasi nessuno disegna nel diagramma: una cartella chiamata POLICY.
Il modello stimava la propensione all'acquisto di ogni cliente. La cartella della policy trasformava quella stima in azione: fasce di propensione, una soglia, la lista di chi riceve l'offerta. La decisione di business stava lì, non nel modello. I numeri del suo progetto qui non compaiono; il problema è lo stesso, ricostruito con dati sintetici.
Il problema visto da un fisico
Prima di qualsiasi curva ROC, un ordine di grandezza. Diecimila clienti, tasso di acquisto del 6%: circa 600 persone che compreranno, sparse nella base clienti. Ogni contatto costa C; ogni vendita lascia un margine V (quello che resta dopo costo del prodotto, tasse, provvigioni e sconti, non il prezzo).
Chiamare un cliente con probabilità p di comprare ha un valore atteso di p·V − C. Conviene quando è positivo:
È la classica teoria delle decisioni, nella formulazione che con Elkan (2001) è diventata il riferimento nel machine learning: se non chiamare non costa nulla, la soglia ottimale è il rapporto C/V. Con 8 € e 120 €, t* ≈ 0,067. Non è 0,5. E non è, in generale, nemmeno il punto di Youden o un altro punto «bello» della curva ROC. Con uno score calibrato, il punto di Youden equivale a tagliare al tasso di base: incorpora un rapporto tra costi che coincide con il tuo solo per caso. Qui, per caso, quasi coincide (il tasso di base è 6,4% e C/V è 6,7%); cambia V nel banco di prova e guarda i due separarsi. (Il punto della ROC pesato per i costi, quello sì, porta allo stesso t*.)
Chiama chi ha una probabilità di comprare maggiore del costo della chiamata diviso quanto rende la vendita. Chiamata da 8 €, vendita da 120 €: chiama chi ha più di 1 possibilità su 15.
Il conto nasconde due condizioni. La prima: p deve essere una probabilità vera. La seconda: chi non riceve la chiamata non compra di sua iniziativa. Tienile a mente tutte e due, perché è lì che si perdono i soldi.
Banco di prova 1 · Scegli la soglia
score calibrato · AUC ——
| Comprerebbe se chiamato | Non comprerebbe | |
|---|---|---|
| Chiamato | —vendita che ha ripagato la chiamata | —chiamata sprecata |
| Non chiamato | —acquirente rimasto sotto la linea (si vede solo perché i dati sono sintetici) | —risparmio azzeccato |
Mostra i numeri in tabella
Dove sono i soldi
1. Smettere di pagare chiamate che non si ripagano
Passando dalla strategia «chiamare tutti» alla regola C/V, la campagna fa — chiamate in meno e il profitto passa da — a —. Le chiamate evitate fanno risparmiare —; per strada si perdono — vendite che, messe insieme, costavano in chiamate più di quanto rendevano. Nessuna vendita nuova è stata inventata: il guadagno nasce dal fatto che smetti di pagare per chi stava sotto C/V.
La soglia di default a 0,5 sbaglia dalla parte opposta. In questa base, —. Secondo l'equazione (1), 0,5 sarebbe ottimale solo se la vendita valesse esattamente il doppio della chiamata (V = 2C); qui vale 15 volte tanto. È un errore di costo, ereditato dal default della libreria. La documentazione stessa di scikit-learn avverte che questa soglia fissa non è quasi mai quella ideale.
I primi soldi che un modello porta sono quelli che smetti di spendere. I secondi sono quelli che smetti di perdere per eccesso di prudenza.
2. Stesso team, più vendite
Con capacità fissa, la domanda passa da «chi vale la pena chiamare» a «chi vale più la pena chiamare». La soglia diventa una posizione nella coda, e a decidere chi entra è la qualità dell'ordinamento in cima alla lista (la precisione nelle prime 1.000 posizioni, che è ciò che determina il lift), non l'AUC sull'intera base. La calibrazione continua a dirti se conviene riempire la coda.
Vendite con 1.000 chiamate. Lift: —. Cambia la capacità nel Banco di prova 1 e queste barre si aggiornano.
—
3. L'asticella la fissa il business, non l'IT
La soglia ottimale è funzione di C e V, non del modello. Muovi i cursori di C e V nel Banco di prova 1 e guarda la zona verde spostarsi senza che il modello cambi di una virgola. Quando cambia il margine del prodotto, o il costo del team, la lista deve cambiare di conseguenza. Prova C = 40 e V = 80, o qualsiasi coppia con V = 2C: è l'unico tipo di mondo in cui l'equazione (1) mette la soglia a 0,5. E guarda cosa mostra il banco di prova in quel caso: in questa base quasi nessuno ha uno score sopra 0,5, quindi nemmeno la soglia giusta salva una campagna che non ha nessuno da chiamare.
Se in azienda nessuno è responsabile di questa soglia, nessuno sta gestendo il modello. Il modello gira e basta.
Dove cede (e dove si perdono i soldi)
Uno score non è una probabilità
L'equazione (1) presuppone che uno score di 0,10 voglia dire il 10% di probabilità. Non tutti i modelli lo garantiscono. Niculescu-Mizil e Caruana hanno mostrato che i metodi a margine massimo, come gli alberi con boosting di tipo AdaBoost e le SVM, spingono le probabilità lontano da 0 e da 1, con una distorsione a forma di sigmoide. (I gradient boosting di oggi, addestrati con la log-loss, di solito ne escono meno distorti.) In pratica, a spostare di più la scala è ribilanciare le classi in addestramento, con il campionamento o con i pesi. Nel Banco di prova 2, il modello non calibrato ha lo stesso ordinamento, la stessa AUC e lo stesso profitto massimo possibile, eppure, applicandogli la regola, si finisce nel punto sbagliato.
Un termoscopio non è un termometro
Tra la fine del Cinquecento e l'inizio del Seicento, Galileo e altri costruirono termoscopi: strumenti che mostravano se una cosa era più calda di un'altra, ma non di quanti gradi. Il termoscopio diventò un vero termometro, con letture confrontabili da uno strumento all'altro, solo quando la scala fu ancorata a punti fissi riproducibili, come quella di Rømer, nel 1701, e poi quella di Fahrenheit.
Un modello con AUC alta e senza calibrazione è un termoscopio. L'AUC è invariante rispetto a qualsiasi trasformazione strettamente crescente dello score: eleva lo score alla 0,6, applicagli una sigmoide, estrai la radice, e l'AUC non si muove. L'equazione (1) invece si sposta tutta. Ordinamento e scala sono grandezze diverse, e la decisione dipende dalla scala.
Il rimedio è noto: calibrare su un insieme separato ed etichettato prima di usare qualsiasi regola di valore atteso. Il Platt scaling funziona bene quando la distorsione ha forma di sigmoide. La regressione isotonica corregge qualsiasi distorsione monotona, ma richiede più dati e va in overfitting con pochi positivi. Nessuna delle due risolve il drift. C'è anche una scorciatoia: con C e V fissi, puoi scegliere la soglia direttamente sullo score, massimizzando il profitto su un campione etichettato separato (è quello che fa il TunedThresholdClassifierCV di scikit-learn). La calibrazione diventa indispensabile quando V cambia da cliente a cliente o quando l'asticella cambia spesso.
Il modello sa chi è più caldo, ma non di quanti gradi. Per decidere se la chiamata conviene, ti servono i gradi.
Il mondo cambia dopo il deploy
Se il mese dopo il tasso di acquisto scende del 40% per stagionalità, lo score resta uguale, ma uno score di 0,10 ora vuol dire il 6% di probabilità. Il modello non è più calibrato, eppure non è cambiato di una virgola. La soglia sulla probabilità resta C/V; la soglia sullo score avrebbe dovuto salire ed è rimasta congelata al giorno 0. Per questo caso specifico, il cambiamento del tasso di base, esiste una correzione classica: aggiustare gli odds in base alla nuova prevalenza (Saerens e colleghi, 2002). Vale quando cambia solo la quota di acquirenti e il profilo di ciascun gruppo resta lo stesso, e il nuovo tasso va misurato: il campione estratto a caso della sezione successiva serve proprio a questo. Guarda lo scenario «Drift» nel Banco di prova 2.
A dicembre comprano tutti; a febbraio no. Se l'asticella di dicembre vale ancora a febbraio, paghi chiamate a chi non comprerà.
Vedi solo quello che hai deciso di vedere
Dopo il deploy, una risposta alla chiamata esiste solo per chi la chiamata l'ha ricevuta. Alla soglia attuale del Banco di prova 1, — clienti che avrebbero comprato se chiamati sono rimasti sotto la linea, e nei dati di produzione nessuno sa come avrebbero risposto. Riaddestrare su questi dati significa imparare da un sottoinsieme scelto dalla soglia stessa, e perfino il monitoraggio della calibrazione eredita questo bias. In letteratura ha un nome: il problema delle etichette selettive (selective labels).
Anche l'LHC ha la coperta corta
All'LHC i fasci si incrociano 40 milioni di volte al secondo, e ogni incrocio porta decine di collisioni. Impossibile conservarle tutte. In ATLAS, il primo livello del trigger riduce il flusso a 100 mila eventi al secondo, e il secondo ne lascia passare circa 3 mila al secondo per l'analisi. È una soglia con capacità fissa, come quella del tuo team commerciale, e con lo stesso problema: quello che il trigger scarta, per l'analisi non esiste.
Una delle soluzioni dei fisici è registrare, di proposito, una parte di ciò che il filtro principale scarterebbe: incroci dei fasci estratti a caso e trigger più laschi con prescale, che tengono 1 evento ogni N. Quel campione diventa il controllo che misura cosa il filtro si sta perdendo. ATLAS, per esempio, ha usato incroci dei fasci estratti a caso come controllo per misurare l'efficienza del suo trigger di minimum bias.
La traduzione nel marketing è diretta: chiamare un piccolo campione casuale anche sotto la soglia. Costa poco e tiene il modello onesto. Se il sorteggio è completo, cioè lasci senza chiamata anche una parte dei clienti sopra la soglia (un gruppo di controllo), lo stesso disegno ti permette di misurare l'effetto reale della chiamata.
Nemmeno il più grande acceleratore di particelle del mondo riesce a conservare tutto quello che vede. Per questo mette da parte un campione a caso, per sapere cosa si sta perdendo. Anche la tua campagna dovrebbe farlo.
La propensione non è l'effetto della chiamata
Il modello prevede chi compra, non chi compra grazie alla chiamata. Il cliente che avrebbe comprato comunque ha uno score alto e consuma un contatto per niente. È la seconda condizione dell'equazione (1): la p giusta lì è la differenza tra la probabilità di comprare con la chiamata e senza. Per questa domanda serve un altro strumento: i modelli di uplift, che stimano l'impatto incrementale dell'azione e hanno bisogno di contatti randomizzati per essere addestrati in modo affidabile.
Bruciare una chiamata, o uno sconto, su chi avrebbe comprato comunque non è vendere, è regalare. Il cliente che vale oro è quello che compra solo se lo chiami.
Banco di prova 2 · Dove cede
usa C e V del Banco di prova 1 · senza limite di capacità—
Mostra i numeri in tabella
Per riprodurlo
Gli stessi passaggi del Banco di prova 1, in Python. I numeri vengono diversi da quelli della pagina perché il generatore casuale è un altro (da un seme all'altro cambiano di qualche migliaio di euro); le conclusioni no.
import numpy as np
rng = np.random.default_rng(7)
N, C, V = 10_000, 8, 120 # clienti, costo per chiamata, valore per vendita
score = rng.beta(0.8, 12, N) # score calibrato per costruzione
buyer = rng.random(N) < score # chi compra davvero
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"regola C/V = {C/V:.3f} | ottimo empirico = {best:.3f}")
print(f"tutti = {profit(0)} | soglia 0.5 = {profit(0.5)} | regola = {profit(C/V)}")
print(f"regola, con 1.000 chiamate = {profit(C/V, 1000)}")
Riferimenti
Decisione e costo
- Elkan, C. (2001). The Foundations of Cost-Sensitive Learning. IJCAI.La formulazione classica, nel ML, dell'equazione (1): la soglia ottimale come rapporto tra costi.
- Provost, F. & Fawcett, T. (2013). Data Science for Business. O'Reilly.Il quadro del valore atteso per le decisioni di marketing, scritto anche per i manager.
- scikit-learn: Tuning the decision threshold for class prediction.La documentazione che avverte che la soglia fissa a 0,5 non è quasi mai quella ideale.
- Wikipedia: Youden's J statistic.Il punto «bello» della ROC, che incorpora un rapporto tra costi che non è il tuo.
Calibrazione e drift
- Niculescu-Mizil, A. & Caruana, R. (2005). Predicting Good Probabilities With Supervised Learning. ICML.Quali modelli risultano non calibrati e quando usare Platt o la regressione isotonica.
- scikit-learn: Probability calibration.Curve di calibrazione e i due metodi, in pratica.
- 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).Come correggere le probabilità quando cambia il tasso di base, se il profilo di ciascuna classe resta lo stesso.
Cosa nasconde la soglia
- Lakkaraju, H. et al. (2017). The Selective Labels Problem: Evaluating Algorithmic Predictions in the Presence of Unobservables. KDD.Perché valutare le decisioni solo sui casi che hanno superato il filtro inganna. Il caso principale sono le decisioni dei giudici sulla libertà su cauzione; il meccanismo è lo stesso.
- Gutierrez, P. & Gérardy, J.-Y. (2017). Causal Inference and Uplift Modelling: A Review of the Literature. PMLR 67.Modellare l'impatto incrementale dell'azione, non la propensione.
Divagazioni
- ATLAS Experiment (2022). ATLAS Event Selection System Readies for LHC Run 3.I numeri del trigger citati sopra.
- Tompkins, L., for the ATLAS Collaboration (2010). Performance of the ATLAS Minimum Bias Trigger in p-p collisions at the LHC. HCP2010.Atti di conferenza. Incroci dei fasci estratti a caso come controllo del trigger.
- Wikipedia: Thermoscope.Dal termoscopio al termometro.
Hai un problema del genere nella tua azienda?
Per le aziende, lo faccio con Vettore Data, la mia società di consulenza: guardiamo il tuo modello, il costo dei tuoi errori e la capacità del tuo team, e ti diciamo quale soglia usare e quanti soldi ci sono in gioco. La versione per chi decide è negli Insights di Vettore.
Leggi la versione per chi decideo scrivimi