Skip to content

Guide

Classificatori e regressori

Un modello predittivo viene valutato come qualsiasi altro sistema: una funzione richiamabile restituisce una previsione per ogni caso, e i valutatori la leggono. Ciò che cambia sono i denominatori. Accuratezza, recall e precisione sono tre tassi su tre insiemi di righe diversi, e un modello può sembrare buono su uno mentre fallisce la domanda che il business sta ponendo.

examples/churn_model/ è il progetto eseguito in questa pagina: duecento account, un modello di abbandono deterministico e nessuna credenziale di provider.

La previsione

Il sistema restituisce un'etichetta e, se il modello ne ha uno, il punteggio che la sostiene:

from oloproof import system


@system(name="churn-model", version="slice-f-example")
def run(account):
    score = churn_score(account)
    return {"label": score >= 0.5, "score": round(score, 4)}

Un caso dichiara la verità sotto expected:

{"expected": {"label": false}, "id": "account_000", "input": {"recent_upgrade": true, "support_contacts": 0, "tenure_months": 0}, "metadata": {"plan": "enterprise"}}

Il blocco `predictive:`

Dove si trovano la previsione, il suo punteggio e la verità si dichiara una volta sola, per il progetto:

predictive:
  label_field: label
  score_field: score
  expected_field: label
  positive: true
  calibration_bins: 10
  thresholds: [0.3, 0.4, 0.5, 0.6, 0.7]
CampoPredefinitoSignificato
label_fieldlabelil campo dell'output che contiene l'etichetta prevista
score_fieldscoreil campo dell'output che contiene il punteggio che la sostiene
expected_fieldlabelil campo sotto expected che contiene la verità
positivetruequale valore dell'etichetta conta come positivo; refund, 1 o true
calibration_bins10quante fasce di punteggio usa la tabella di calibrazione
thresholdsnessunosoglie da esplorare; ciascuna è evidenza, mai una raccomandazione
averagenessunomacro o micro, per un aggregato su più classi

Ogni valutatore predittivo che non dichiara da sé field, expected_field o positive li prende da questo blocco, quindi una suite ha una sola classe positiva. Il blocco è anche ciò che produce i conteggi della matrice di confusione, la tabella di calibrazione e l'esplorazione delle soglie; un progetto senza di esso ottiene le metriche e nient'altro.

Una classe positiva a cui non corrisponde l'etichetta di alcun caso viene rifiutata prima che venga eseguito qualsiasi cosa, perché il recall su di essa sarebbe un tasso sul nulla. Lo stesso progetto con positive: churned:

Configuration error: evaluator 'recall' counts 'churned' as the positive class, and no case's 'label' is 'churned' (labels: False, True); declare `positive:` on the evaluator or in the `predictive:` block

I valutatori

evaluators:
  - {type: predictive_correct, criterion: accuracy}
  - {type: predictive_recall, criterion: recall}
  - {type: predictive_precision, criterion: precision}
  - {type: predictive_brier, criterion: brier}
  - {type: predictive_log_loss, criterion: log_loss, clip: 0.02}
  - {type: predictive_ranking, criterion: rank}
metrics:
  - {id: roc_auc, type: ranking, criterion: rank, statistic: roc_auc}
  - {id: pr_auc, type: ranking, criterion: rank, statistic: average_precision}
slices: [metadata.plan, "confidence:0.5"]
min_slice_support: 20

predictive_log_loss richiede clip, perché altrimenti un solo errore sicuro di sé vale infinito. predictive_ranking è il criterio in base al quale una metrica di ranking ordina le righe, e richiede una voce metrics: che indichi la statistica: ROC-AUC e average precision rispondono a domande diverse, e il motore non ne sceglierà una al posto tuo.

oloproof run
│ accuracy  │ 88.5%    │ [83.2%, 92.6%]  │ 177 / 200 observed · 0 missing · 0 excluded                                │
│ recall    │ 81.2%    │ [69.5%, 90.0%]  │ 52 / 64 observed · 0 missing · 136 excluded                                │
│ precision │ 82.5%    │ [70.9%, 91.0%]  │ 52 / 63 observed · 0 missing · 137 excluded                                │
│ brier     │ 0.120    │ [0.094, 0.154]  │ mean of 200 observed · 0 missing · 0 excluded                              │
│ log_loss  │ 0.389    │ [0.323, 0.499]  │ mean of 200 observed · 0 missing · 0 excluded                              │
│ roc_auc   │ 92.3%    │ [69.3%, 100.0%] │ roc_auc over 64 positive · 136 negative · 0 missing · 0 excluded           │
│ pr_auc    │ 86.5%    │                 │ average_precision over 64 positive · 136 negative · 0 missing · 0 excluded │

Leggi la colonna excluded. Il recall è misurato sui 64 account che hanno abbandonato, quindi gli altri 136 ne sono esclusi; la precisione sui 63 che il modello ha segnalato. Il trentadue per cento di questi account abbandona, quindi un modello che prevede che nessuno abbandoni è accurato al 68% e non individua nessuno. Una soglia minima sulla sola accuratezza lo farebbe passare, ed è per questo che la policy dell'esempio mette una soglia minima su ciascun tasso.

pr_auc ha una stima e nessun intervallo. Con duecento righe il suo intervallo è realmente più debole di quello della ROC-AUC, e il motore omette un limite che non può sostenere anziché mostrarne uno. Una regola su di essa riporta:

pr: INSUFFICIENT_EVIDENCE (interval_unavailable)

Accanto alle metriche

I conteggi della matrice di confusione sono conteggi, non tassi:

│ actually positive │ 52                 │ 12                 │
│ actually negative │ 11                 │ 125                │

Una regola di rilascio che ne indica uno è un errore di configurazione, perché un conteggio non è una metrica:

Configuration error: release rule 'fp' refers to unknown metric 'false_positives'

La tabella di calibrazione mette a confronto ciò che il modello ha dichiarato con ciò che è accaduto, per fascia di punteggio:

│ 0.2-0.3 │ 26.7%   │ 0.0%     │ 34 rows │
│ 0.5-0.6 │ 53.4%   │ 81.0%    │ 21 rows │

E l'esplorazione delle soglie mostra che cosa avrebbe misurato ciascuna soglia dichiarata:

│ 0.3     │ 57.4%     │ 96.9%  │ 62/108 predicted positive · 62/64 actual positive │
│ 0.5     │ 82.5%     │ 81.2%  │ 52/63 predicted positive · 52/64 actual positive  │
│ 0.7     │ 100.0%    │ 37.5%  │ 24/24 predicted positive · 24/64 actual positive  │

L'esplorazione è intitolata Thresholds (exploratory; recommends nothing). Quale soglia sia giusta dipende da quanto costa un falso positivo rispetto a un falso negativo, e questo non è qualcosa che il motore possa sapere.

Regressione

Un regressore viene valutato in base all'errore assoluto, che richiede l'intervallo in cui ricadono i suoi valori obiettivo:

evaluators:
  - type: predictive_absolute_error
    criterion: days_error
    field: days
    expected_field: days
    target_range: [0, 20]
rules:
  - id: error-budget
    metric: days_error
    max: 1.5
│ days_error │ 1.02     │ [0.78, 1.88] │ mean of 120 observed · 0 missing · 0 excluded │
error-budget: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)

target_range è obbligatorio, non ha un valore predefinito. Un errore assoluto è una media limitata, e il suo intervallo vale solo all'interno di un intervallo di valori in cui ricade ogni valore. Un intervallo di valori più ampio dà un intervallo di confidenza più ampio, quindi dichiara l'intervallo che i valori obiettivo possono effettivamente assumere. La regola non può decidere: la stima è entro il budget, e 120 ordini non possono ancora dimostrare che lo sia il vero errore medio.

Dove andare dopo

  • Slice tratta le fasce confidence: e il supporto delle slice.
  • Regole di confronto tratta il confronto tra due versioni di un

modello.