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_fieldlabelالحقل تحت expected الذي يحمل الحقيقة
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 التي أشار إليها النموذج. يغادر اثنان وثلاثون بالمئة من هذه الحسابات، لذا فإن نموذجًا يتنبأ بأن أحدًا لن يغادر يكون دقيقًا بنسبة 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 طلبًا لا تستطيع بعدُ أن تُظهر أن متوسط الخطأ الحقيقي كذلك.

إلى أين بعد ذلك