Skip to content

가이드

분류기와 회귀 모델

예측 모델도 다른 시스템과 똑같이 평가합니다. 호출 가능한 객체가 케이스마다 예측을 반환하고, 평가기가 그것을 읽습니다. 달라지는 것은 분모입니다. 정확도, 재현율, 정밀도는 서로 다른 세 행 집합에 대한 세 가지 비율이며, 모델은 하나에서는 좋아 보이면서도 비즈니스가 묻는 질문에서는 실패할 수 있습니다.

이 페이지에서 실행하는 프로젝트는 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_fieldlabel예측 레이블을 담은 출력 필드
score_fieldscore그 레이블의 근거가 된 점수를 담은 출력 필드
expected_fieldlabelexpected 아래에서 정답을 담은 필드
positivetrue양성으로 셀 레이블 값. refund, 1 또는 true
calibration_bins10보정 표가 사용하는 점수 구간의 수
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: 20

predictive_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건으로는 실제 평균 오차가 한도 안에 있음을 아직 보여 줄 수 없습니다.

다음 단계

  • 슬라이스는 confidence: 구간과 슬라이스 지지도를 다룹니다.
  • 비교 규칙은 두 모델 버전의 비교를 다룹니다.