가이드
분류기와 회귀 모델
예측 모델도 다른 시스템과 똑같이 평가합니다. 호출 가능한 객체가 케이스마다 예측을 반환하고, 평가기가 그것을 읽습니다. 달라지는 것은 분모입니다. 정확도, 재현율, 정밀도는 서로 다른 세 행 집합에 대한 세 가지 비율이며, 모델은 하나에서는 좋아 보이면서도 비즈니스가 묻는 질문에서는 실패할 수 있습니다.
이 페이지에서 실행하는 프로젝트는 examples/churn_model/입니다. 계정 이백 개, 결정론적 이탈 모델로 구성되며 제공자 자격 증명은 필요 없습니다.
예측
시스템은 레이블을 반환하고, 모델에 점수가 있다면 그 레이블의 근거가 된 점수도 반환합니다.
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)}케이스는 expected 아래에 정답을 선언합니다.
{"expected": {"label": false}, "id": "account_000", "input": {"recent_upgrade": true, "support_contacts": 0, "tenure_months": 0}, "metadata": {"plan": "enterprise"}}`predictive:` 블록
예측, 그 점수, 정답이 어디에 있는지는 프로젝트 단위로 한 번 선언합니다.
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]| 필드 | 기본값 | 의미 |
|---|---|---|
| label_field | label | 예측 레이블을 담은 출력 필드 |
| score_field | score | 그 레이블의 근거가 된 점수를 담은 출력 필드 |
| expected_field | label | expected 아래에서 정답을 담은 필드 |
| positive | true | 양성으로 셀 레이블 값. refund, 1 또는 true |
| calibration_bins | 10 | 보정 표가 사용하는 점수 구간의 수 |
| thresholds | 없음 | 훑어볼 컷오프. 각각은 근거이며 결코 권고가 아닙니다 |
| average | 없음 | 여러 클래스에 대한 집계를 위한 macro 또는 micro |
field, expected_field, positive를 직접 명시하지 않은 모든 예측 평가기는 이 블록에서 값을 가져오므로, 한 스위트에는 하나의 양성 클래스가 있습니다. 혼동 행렬 개수, 보정 표, 임계값 스윕을 만드는 것도 이 블록입니다. 이 블록이 없는 프로젝트는 지표만 얻고 그 밖의 것은 얻지 못합니다.
어떤 케이스의 레이블과도 일치하지 않는 양성 클래스는 아무것도 실행되기 전에 거부됩니다. 그 클래스에 대한 재현율은 아무것도 없는 것에 대한 비율이 되기 때문입니다. 같은 프로젝트에 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평가기
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는 clip이 필요합니다. 그렇지 않으면 확신에 찬 실수 하나가 무한대가 되기 때문입니다. predictive_ranking은 순위 지표가 행을 정렬하는 기준이며, 통계량을 지정하는 metrics: 항목이 필요합니다. ROC-AUC와 평균 정밀도는 서로 다른 질문에 답하며, 엔진은 둘 중 하나를 대신 골라 주지 않습니다.
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 │excluded 열을 읽으십시오. 재현율은 이탈한 64개 계정에 대해 측정되므로 나머지 136개는 재현율에서 제외됩니다. 정밀도는 모델이 표시한 63개에 대해 측정됩니다. 이 계정들 중 32퍼센트가 이탈하므로, 아무도 이탈하지 않는다고 예측하는 모델은 정확도가 68%이면서 아무도 찾아내지 못합니다. 정확도에만 하한을 두면 그런 모델이 통과하므로, 예제의 정책은 각 비율마다 하한을 둡니다.
pr_auc에는 추정값은 있지만 구간은 없습니다. 이백 행에서는 그 구간이 ROC-AUC의 구간보다 실제로 더 약하며, 엔진은 뒷받침할 수 없는 경계를 보여 주는 대신 보류합니다. 이 지표에 대한 규칙은 다음과 같이 표시됩니다.
pr: INSUFFICIENT_EVIDENCE (interval_unavailable)지표 외의 것
혼동 행렬 개수는 비율이 아니라 개수입니다.
│ actually positive │ 52 │ 12 │
│ actually negative │ 11 │ 125 │이 중 하나를 지정하는 릴리스 규칙은 구성 오류입니다. 개수는 지표가 아니기 때문입니다.
Configuration error: release rule 'fp' refers to unknown metric 'false_positives'보정 표는 점수 구간별로 모델이 주장한 것과 실제로 일어난 것을 나란히 놓습니다.
│ 0.2-0.3 │ 26.7% │ 0.0% │ 34 rows │
│ 0.5-0.6 │ 53.4% │ 81.0% │ 21 rows │그리고 임계값 스윕은 선언된 각 컷오프가 측정했을 결과를 보여 줍니다.
│ 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 │스윕의 제목은 Thresholds (exploratory; recommends nothing)입니다. 어떤 컷오프가 옳은지는 거짓 음성에 비해 거짓 양성의 비용이 얼마인지에 달려 있으며, 이는 엔진이 알 수 있는 것이 아닙니다.
회귀
회귀 모델은 절대 오차로 채점하며, 이를 위해 목표값이 놓이는 범위가 필요합니다.
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는 기본값이 없는 필수 항목입니다. 절대 오차는 유계 평균이며, 그 구간은 모든 값이 놓이는 범위 안에서만 성립합니다. 범위가 넓으면 구간도 넓어지므로, 목표값이 실제로 가질 수 있는 범위를 선언하십시오. 이 규칙은 결정을 내리지 못합니다. 추정값은 허용 한도 안에 있지만, 주문 120건으로는 실제 평균 오차가 한도 안에 있음을 아직 보여 줄 수 없습니다.