Guias
Classificadores e regressores
Um modelo preditivo é avaliado como qualquer outro sistema: uma função chamável retorna uma predição para cada caso, e avaliadores a leem. O que muda são os denominadores. Acurácia, recall e precisão são três taxas sobre três conjuntos diferentes de linhas, e um modelo pode parecer bom em uma enquanto falha na pergunta que o negócio está fazendo.
examples/churn_model/ é o projeto que esta página executa: duzentas contas, um modelo de churn determinístico e nenhuma credencial de provedor.
A predição
O sistema retorna um rótulo e, se o modelo tiver um, o score por trás dele:
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)}Um caso declara a verdade em expected:
{"expected": {"label": false}, "id": "account_000", "input": {"recent_upgrade": true, "support_contacts": 0, "tenure_months": 0}, "metadata": {"plan": "enterprise"}}O bloco `predictive:`
Onde ficam a predição, seu score e a verdade é declarado uma vez, para o projeto:
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]| Campo | Padrão | Significado |
|---|---|---|
| label_field | label | o campo da saída que contém o rótulo previsto |
| score_field | score | o campo da saída que contém o score por trás dele |
| expected_field | label | o campo em expected que contém a verdade |
| positive | true | qual valor de rótulo conta como positivo; refund, 1 ou true |
| calibration_bins | 10 | quantas faixas de score a tabela de calibração usa |
| thresholds | nenhum | pontos de corte a varrer; cada um é evidência, nunca uma recomendação |
| average | nenhum | macro ou micro, para um agregado sobre várias classes |
Todo avaliador preditivo que não declara ele mesmo field, expected_field ou positive os obtém deste bloco, de modo que uma suíte tem uma única classe positiva. O bloco também é o que produz as contagens da matriz de confusão, a tabela de calibração e a varredura de limiares; um projeto sem ele obtém as métricas e nada além delas.
Uma classe positiva que não corresponde ao rótulo de nenhum caso é recusada antes de qualquer execução, porque o recall sobre ela seria uma taxa sobre nada. O mesmo projeto com 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:` blockOs avaliadores
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: 20predictive_log_loss exige clip, porque, sem isso, um único erro cometido com confiança é infinito. predictive_ranking é o critério pelo qual uma métrica de ranking ordena as linhas, e ele precisa de uma entrada em metrics: que indique a estatística: ROC-AUC e precisão média respondem a perguntas diferentes, e o engine não escolhe uma por você.
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 │Leia a coluna excluded. O recall é medido sobre as 64 contas que deram churn, então as outras 136 ficam excluídas dele; a precisão, sobre as 63 que o modelo sinalizou. Trinta e dois por cento dessas contas dão churn, então um modelo que prevê que ninguém dá churn tem 68% de acurácia e não encontra ninguém. Um piso apenas sobre a acurácia o aprovaria, e é por isso que a política do exemplo coloca um piso em cada taxa.
pr_auc tem uma estimativa e nenhum intervalo. Com duzentas linhas, seu intervalo é de fato mais fraco que o do ROC-AUC, e o engine omite um limite que não consegue sustentar em vez de exibi-lo. Uma regra sobre ela resulta em:
pr: INSUFFICIENT_EVIDENCE (interval_unavailable)Além das métricas
As contagens da matriz de confusão são contagens, não taxas:
│ actually positive │ 52 │ 12 │
│ actually negative │ 11 │ 125 │Uma regra de lançamento que cite uma delas é um erro de configuração, porque uma contagem não é uma métrica:
Configuration error: release rule 'fp' refers to unknown metric 'false_positives'A tabela de calibração confronta o que o modelo afirmou com o que aconteceu, por faixa de score:
│ 0.2-0.3 │ 26.7% │ 0.0% │ 34 rows │
│ 0.5-0.6 │ 53.4% │ 81.0% │ 21 rows │E a varredura de limiares mostra o que cada ponto de corte declarado teria medido:
│ 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 │A varredura tem o título Thresholds (exploratory; recommends nothing). Qual ponto de corte é o certo depende do custo de um falso positivo em relação a um falso negativo, e isso não é algo que o engine possa saber.
Regressão
Um regressor é pontuado pelo erro absoluto, que precisa do intervalo em que seus alvos se encontram:
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 é obrigatório, não tem valor padrão. Um erro absoluto é uma média limitada, e seu intervalo só vale dentro de uma faixa em que todos os valores estejam. Uma faixa mais larga dá um intervalo mais largo, então declare a faixa que os alvos realmente podem assumir. A regra não consegue decidir: a estimativa está dentro do orçamento, e 120 pedidos ainda não conseguem mostrar que o verdadeiro erro médio também está.
Próximos passos
- Segmentos trata das faixas confidence: e do suporte de segmentos.
- Regras de comparação trata da comparação entre duas versões de um modelo.