المراقبة والملاحظة

اكتشاف انحراف النموذج

5 دقيقة للقراءة

انحراف النموذج هو القاتل الصامت لأنظمة ML. يختبر المحاورون فهمك لأنواع الانحراف وطرق الاكتشاف واستراتيجيات التخفيف.

أنواع الانحراف

نوع الانحراف التعريف المثال طريقة الاكتشاف
انحراف البيانات تغير توزيع المدخلات تحول ديموغرافيات المستخدمين KS-test، PSI
انحراف المفهوم تغير العلاقة بين X وY تطور أنماط الاحتيال مراقبة الأداء
انحراف التسمية تغير توزيع الهدف المزيد من المراجعات الإيجابية اختبار Chi-square
انحراف المنبع تغيرات خط أنابيب البيانات إضافة مصدر بيانات جديد التحقق من المخطط

سؤال المقابلة: اكتشاف انحراف الإنتاج

السؤال: "انخفضت دقة نموذج اكتشاف الاحتيال من 95% إلى 80% خلال 3 أشهر. كيف ستشخص وتصلح هذا؟"

إجابة منظمة:

def diagnose_model_degradation():
    steps = {
        "1_verify_metrics": """
            أولاً، تحقق من حساب المقاييس نفسه:
            - هل تسمية الحقيقة الأساسية متسقة؟
            - هل تغيرت منهجية التقييم؟
            - هل حجم العينة كافٍ للأهمية؟
        """,

        "2_check_data_drift": """
            قارن بيانات الإنتاج ببيانات التدريب:
            - توزيعات الميزات (KS-test لكل ميزة)
            - مؤشر استقرار السكان (PSI) الإجمالي
            - أنماط القيم المفقودة
        """,

        "3_check_concept_drift": """
            تحليل سلوك النموذج:
            - تحول توزيع التوقعات
            - توزيع درجة الثقة
            - الأداء حسب فوج الوقت
        """,

        "4_identify_root_cause": """
            الأسباب المحتملة:
            - تكيف المحتالين مع النموذج (انحراف المفهوم)
            - شريحة مستخدمين جديدة (انحراف البيانات)
            - خطأ في هندسة الميزات (انحراف المنبع)
            - الموسمية (انحراف زمني)
        """,

        "5_remediation": """
            بناءً على التشخيص:
            - إعادة التدريب على البيانات الحديثة
            - إضافة ميزات جديدة تلتقط الأنماط الجديدة
            - تنفيذ التعلم عبر الإنترنت
            - نشر نموذج منافس
        """
    }
    return steps

الاختبارات الإحصائية لاكتشاف الانحراف

اختبار Kolmogorov-Smirnov (KS-test):

from scipy import stats
import numpy as np

def detect_feature_drift(training_data, production_data, threshold=0.05):
    """اكتشاف الانحراف باستخدام KS-test لكل ميزة"""
    drift_results = {}

    for feature in training_data.columns:
        stat, p_value = stats.ks_2samp(
            training_data[feature],
            production_data[feature]
        )

        drift_results[feature] = {
            "ks_statistic": stat,
            "p_value": p_value,
            "drift_detected": p_value < threshold
        }

    return drift_results

مؤشر استقرار السكان (PSI):

def calculate_psi(baseline, current, bins=10):
    """
    تفسير PSI:
    - PSI < 0.1: لا انحراف كبير
    - 0.1 <= PSI < 0.2: انحراف معتدل (تحقق)
    - PSI >= 0.2: انحراف كبير (إجراء مطلوب)
    """
    baseline_pct, _ = np.histogram(baseline, bins=bins, density=True)
    current_pct, _ = np.histogram(current, bins=bins, density=True)

    # تجنب القسمة على صفر
    baseline_pct = np.where(baseline_pct == 0, 0.0001, baseline_pct)
    current_pct = np.where(current_pct == 0, 0.0001, current_pct)

    psi = np.sum((current_pct - baseline_pct) *
                 np.log(current_pct / baseline_pct))

    return psi

اكتشاف الانحراف مع Evidently

from evidently import ColumnMapping
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset, TargetDriftPreset

def generate_drift_report(reference_data, current_data):
    column_mapping = ColumnMapping(
        target="label",
        prediction="prediction",
        numerical_features=["feature_1", "feature_2", "feature_3"],
        categorical_features=["category_a", "category_b"]
    )

    report = Report(metrics=[
        DataDriftPreset(),
        TargetDriftPreset()
    ])

    report.run(
        reference_data=reference_data,
        current_data=current_data,
        column_mapping=column_mapping
    )

    # التصدير للوحات المعلومات
    report.save_html("drift_report.html")

    # الوصول البرمجي
    results = report.as_dict()
    return results

متابعة المقابلة: استراتيجية التنبيه

السؤال: "كيف تحدد عتبات تنبيه الانحراف؟"

# استراتيجية التنبيه المتدرجة
alerting_config:
  feature_drift:
    psi_warning: 0.1      # تحقق
    psi_critical: 0.2     # إجراء فوري

  performance_drift:
    precision_warning: 0.05   # انخفاض 5%
    precision_critical: 0.10  # انخفاض 10%

  prediction_drift:
    distribution_shift_warning: 0.15
    distribution_shift_critical: 0.25

  response:
    warning: "إشعار Slack + تذكرة Jira"
    critical: "PagerDuty + تشغيل إعادة التدريب تلقائياً"

رؤية خبير: في المقابلات، اذكر أن اكتشاف الانحراف بلا فائدة بدون اعتبار زمن الانتظار للحقيقة الأساسية. "يمكننا فقط اكتشاف انحراف المفهوم بعد وصول التسميات، والتي قد تستغرق أسابيع في اكتشاف الاحتيال."

في الدرس التالي، سنغطي تتبع التجارب وسجل النماذج. :::

اختبار

الوحدة 4: المراقبة والملاحظة

خذ الاختبار