کالیبراسیون احتمال مدل چیست؟ آموزش ارزیابی احتمال و انتخاب آستانه با Python

آیا احتمال ۸۰ درصدی یک مدل واقعاً یعنی از هر ۱۰ پیش‌بینی مشابه، حدود ۸ مورد رخ می‌دهد؟ در این آموزش، کالیبراسیون احتمال، نمودار قابلیت اعتماد، Brier Score و انتخاب آستانه تصمیم را با کد Python و scikit-learn یاد می‌گیرید.

Share
کالیبراسیون احتمال مدل چیست؟ آموزش ارزیابی احتمال و انتخاب آستانه با Python

فرض کنید مدلی برای هر پیام پشتیبانی، احتمال «نیاز به بررسی فوری» را پیش‌بینی می‌کند. مدل به ۱۰۰ پیام، احتمال حدود ۸۰ درصد می‌دهد. اگر پیش‌بینی‌ها خوب کالیبره شده باشند، انتظار داریم نزدیک به ۸۰ پیام از این گروه واقعاً به بررسی فوری نیاز داشته باشند.

ممکن است مدل پیام‌های فوری را در رتبه‌های بالاتر قرار دهد و از نظر طبقه‌بندی عملکرد خوبی داشته باشد، اما احتمال‌هایش دقیق نباشند. برای مثال، برای همان گروه احتمال ۸۰ درصد اعلام کند، در حالی که فقط ۵۰ درصد پیام‌ها فوری باشند.

این تفاوت زمانی مهم می‌شود که احتمال پیش‌بینی‌شده برای تصمیم‌های عملی استفاده شود: چند پرونده به کارشناس ارجاع داده شود، چه تعداد هشدار تولید شود و از چه نقطه‌ای هزینه از دست دادن یک مورد مهم از هزینه بررسی اضافی بیشتر باشد.

Probability Calibration یا کالیبراسیون احتمال، به سنجش و اصلاح رابطه میان احتمال اعلام‌شده و فراوانی واقعی رخداد کمک می‌کند. پس از آن می‌توان آستانه تصمیم را متناسب با هدف و هزینه خطاها انتخاب کرد. این دو کار به هم مربوط‌اند، اما یکسان نیستند.

در این مقاله، مفاهیم را با یک مثال کامل در Python بررسی می‌کنیم: ساخت داده، آموزش مدل، ترسیم نمودار کالیبراسیون، مقایسه دو روش اصلاح احتمال و انتخاب آستانه روی داده اعتبارسنجی.

کالیبراسیون احتمال چیست؟

در یک مسئله طبقه‌بندی دودویی، مدل ممکن است برای هر نمونه عددی بین صفر و یک برگرداند. این عدد معمولاً به‌عنوان احتمال تعلق نمونه به کلاس مثبت استفاده می‌شود.

اگر مدل برای مجموعه‌ای بزرگ از نمونه‌های مشابه احتمال نزدیک به ۰٫۷ اعلام کند، مدلی خوب کالیبره شده است که تقریباً ۷۰ درصد آن نمونه‌ها واقعاً مثبت باشند.

احتمال اعلام‌شده برای یک گروهسهم واقعی نمونه‌های مثبتبرداشت
حدود ۲۰٪حدود ۲۰٪در این محدوده خوب کالیبره شده است
حدود ۸۰٪حدود ۵۰٪احتمال را بیش از اندازه اعلام می‌کند
حدود ۴۰٪حدود ۷۰٪احتمال را کمتر از واقع اعلام می‌کند

کالیبراسیون درباره گروهی از پیش‌بینی‌ها سنجیده می‌شود. وقوع یا عدم وقوع یک رویداد منفرد به‌تنهایی ثابت نمی‌کند احتمال اعلام‌شده برای آن درست یا نادرست بوده است.

مستندات scikit-learn نیز کالیبراسیون را از طریق مقایسه احتمال‌های پیش‌بینی‌شده با فراوانی رخداد در گروه‌های مختلف توضیح می‌دهد. scikit-learn.org

تفاوت کالیبراسیون، قدرت تفکیک و تصمیم‌گیری

سه پرسش را باید جداگانه پاسخ داد:

  1. قدرت تفکیک: آیا نمونه‌های مثبت معمولاً امتیاز بالاتری از نمونه‌های منفی می‌گیرند؟
  2. کالیبراسیون: آیا احتمال اعلام‌شده با فراوانی واقعی رخداد هم‌خوان است؟
  3. تصمیم‌گیری: از چه احتمالی به بعد باید اقدام کنیم؟

برای نمونه، مدلی ممکن است موارد فوری را به‌خوبی بالاتر از موارد معمول رتبه‌بندی کند، ولی برای همه آن‌ها احتمال‌هایی بیش از اندازه بزرگ اعلام کند. در چنین وضعی، رتبه‌بندی می‌تواند مفید باشد، اما استفاده مستقیم از عدد احتمال برای برآورد حجم کار تیم خطا ایجاد می‌کند.

از طرف دیگر، اصلاح احتمال الزاماً به معنای بهتر شدن همه معیارهای طبقه‌بندی نیست. آستانه‌ای که احتمال را به برچسب «فوری» یا «معمولی» تبدیل می‌کند نیز بر Precision، Recall و تعداد هشدارها اثر دارد.

ابزار یا معیارپرسشی که بیشتر به آن پاسخ می‌دهد
ROC AUCآیا مدل مثبت‌ها را بالاتر از منفی‌ها رتبه‌بندی می‌کند؟
Average Precision و منحنی Precision–Recallکیفیت بازیابی مثبت‌ها در آستانه‌های مختلف چگونه است؟
نمودار کالیبراسیوناحتمال اعلام‌شده با فراوانی واقعی چقدر هم‌خوان است؟
Brier Scoreکیفیت کلی پیش‌بینی احتمالی چگونه است؟
ماتریس درهم‌ریختگیبا یک آستانه مشخص، چه نوع خطاهایی رخ داده‌اند؟
هزینه عملیاتیپیامد واقعی مثبت و منفی کاذب برای این کاربرد چیست؟

چرا Accuracy برای ارزیابی احتمال کافی نیست؟

Accuracy فقط سهم برچسب‌های درست را پس از انتخاب یک آستانه نشان می‌دهد. این معیار نمی‌گوید عدد ۰٫۸گزارش‌شده توسط مدل چقدر قابل اعتماد است.

برای مثال، دو مدل ممکن است دقیقاً برای همان پیام‌ها برچسب مثبت و منفی تولید کنند. یکی برای پیام‌های مثبت احتمال ۰٫۶ و دیگری احتمال ۰٫۹۹ اعلام کند. Accuracy آن‌ها برابر خواهد بود، اما کیفیت پیش‌بینی احتمالی‌شان می‌تواند بسیار متفاوت باشد.

در داده نامتوازن، مشکل دیگری هم وجود دارد: اگر فقط ۵ درصد پیام‌ها فوری باشند، مدلی که تقریباً همه پیام‌ها را معمولی تشخیص می‌دهد ممکن است Accuracy ظاهراً بالایی داشته باشد. بنابراین برای ارزیابی باید نرخ رخداد، معیارهای بازیابی کلاس مثبت و کیفیت احتمال‌ها را کنار هم دید.

نمودار کالیبراسیون یا Reliability Diagram چیست؟

در Reliability Diagram پیش‌بینی‌ها بر اساس احتمال اعلام‌شده به چند بازه تقسیم می‌شوند. سپس در هر بازه دو مقدار مقایسه می‌شود:

  • میانگین احتمال اعلام‌شده مدل
  • سهم واقعی نمونه‌های مثبت

اگر این دو مقدار در بازه‌های مختلف به هم نزدیک باشند، منحنی به خط قطری ایدئال نزدیک می‌شود.

برای مثال، در گروه پیام‌هایی که مدل به‌طور میانگین احتمال ۰٫۶ به آن‌ها داده است، سهم واقعی پیام‌های فوری را محاسبه می‌کنیم. اگر این سهم حدود ۰٫۶ باشد، مدل در آن بخش از دامنه احتمال خوب عمل کرده است.

محدودیت نمودار کالیبراسیون

شکل نمودار به تعداد بازه‌ها و تعداد نمونه‌های هر بازه وابسته است. اگر در یک بازه فقط چند نمونه قرار بگیرند، تخمین سهم واقعی مثبت‌ها ناپایدار خواهد بود.

بهتر است نمودار را همراه با تعداد نمونه‌ها در بازه‌های مختلف و معیاری عددی مانند Brier Score بررسی کنید. همچنین ممکن است مدل در احتمال‌های میانی خوب کالیبره باشد، ولی در احتمال‌های بسیار بالا خطای مهمی داشته باشد.

Brier Scoreچیست؟

Brier Score فاصله میان احتمال پیش‌بینی‌شده و نتیجه واقعی را برای همه نمونه‌ها خلاصه می‌کند. در طبقه‌بندی دودویی، هرچه مقدار آن کمتر باشد، پیش‌بینی‌های احتمالی از دید این معیار بهترند.

برای درک شهودی، اگر رویدادی رخ دهد و مدل احتمال ۰٫۹ برای آن اعلام کرده باشد، خطای احتمالی کوچک‌تر از زمانی است که احتمال ۰٫۱ اعلام کرده باشد. Brier Score این نوع خطا را روی کل نمونه‌ها میانگین می‌گیرد.

بااین‌حال، Brier Scoreمعادل یک اندازه‌گیری خالص از کالیبراسیون نیست. این معیار علاوه بر هم‌خوانی احتمال با فراوانی رخداد، از قدرت مدل در جداکردن نمونه‌ها نیز تأثیر می‌گیرد. به همین دلیل، بهتر است آن را همراه با نمودار کالیبراسیون و معیارهای رتبه‌بندی بخوانید. scikit-learn.org

چه مدل‌هایی به کالیبراسیون نیاز دارند؟

برای هیچ خانواده مدلی نباید بدون ارزیابی فرض کرد که احتمال‌هایش حتماً خوب یا بد کالیبره‌اند. رفتار مدل به داده، تنظیمات آموزش، اندازه نمونه و تغییر شرایط پس از استقرار وابسته است.

کالیبراسیون می‌تواند برای خروجی این مدل‌ها بررسی شود:

  • Random Forest
  • Gradient Boosting
  • SVM
  • شبکه‌های عصبی
  • مدل‌های خطی
  • مدل‌های طبقه‌بندی متن
  • سامانه‌های پیش‌بینی ریسک یا اولویت

اگر خروجی مدل فقط برای مرتب‌سازی نمونه‌ها استفاده می‌شود، کیفیت رتبه‌بندی ممکن است مهم‌ترین موضوع باشد. اگر خروجی به شکل «احتمال ۷۵ درصد» به کاربر یا یک سامانه تصمیم‌گیری ارائه می‌شود، بررسی کالیبراسیون ضرورت بیشتری پیدا می‌کند.

دو روش رایج کالیبراسیون: Sigmoid وIsotonic

کالیبراسیون Sigmoid یا روشPlatt

این روش یک تبدیل با شکل سیگموید روی خروجی مدل می‌آموزد تا ارتباط آن با فراوانی واقعی رخداد بهتر شود.

Sigmoidپارامترهای نسبتاً کمی دارد؛ ازاین‌رو معمولاً نقطه شروع مناسبی برای آزمایش است، به‌ویژه وقتی داده کالیبراسیون محدود باشد. البته شکل رابطه‌ای که می‌تواند اصلاح کند انعطاف محدودی دارد.

کالیبراسیونIsotonic

روش Isotonic یک تبدیل یکنوای انعطاف‌پذیرتر یاد می‌گیرد. بنابراین می‌تواند شکل‌هایی از خطای کالیبراسیون را اصلاح کند که یک تبدیل سیگموید به‌خوبی پوشش نمی‌دهد.

انعطاف بیشتر هزینه دارد: اگر نمونه‌های کالیبراسیون کم باشند، خطر بیش‌برازش بالا می‌رود. مستندات scikit-learn نیز توصیه می‌کند هنگام کوچک بودن داده کالیبراسیون در استفاده از Isotonic احتیاط شود. scikit-learn.org

ویژگیSigmoidIsotonic
نوع تبدیلپارامتریانعطاف‌پذیر و ناپارامتری
نیاز به دادهمعمولاً کمترمعمولاً بیشتر
خطر بیش‌برازش با داده کمکمتربیشتر
توان اصلاح شکل‌های پیچیدهمحدودتربیشتر
روش انتخابمقایسه روی داده اعتبارسنجیمقایسه روی داده اعتبارسنجی

هیچ‌یک همیشه برنده نیستند. باید آن‌ها را روی داده‌ای که در آموزش و کالیبراسیون استفاده نشده است مقایسه کرد.

چرا تفکیک Train، Validation و Test اهمیت دارد؟

اگر مدل پایه و تبدیل کالیبراسیون را روی همان پیش‌بینی‌های حاصل از آموزش مدل پایه تنظیم کنیم، نتیجه ممکن است بیش از اندازه خوش‌بینانه باشد.

در مثال عملی این مقاله، نقش داده‌ها چنین است:

  • Train: آموزش مدل و کالیبراسیون آن با اعتبارسنجی متقاطع داخلی
  • Validation: مقایسه مدل‌ها و انتخاب آستانه تصمیم
  • Test: یک ارزیابی نهایی پس از پایان انتخاب‌ها

CalibratedClassifierCV در scikit-learn می‌تواند پیش‌بینی‌های لازم برای کالیبراسیون را از تقسیم‌بندی‌های اعتبارسنجی متقاطع تهیه کند. به این ترتیب، کالیبراتور برای هر تقسیم به پیش‌بینی نمونه‌هایی دسترسی پیدا می‌کند که مدل پایه همان تقسیم روی آن‌ها آموزش ندیده است. scikit-learn 1.9.1 documentation

نکته: اگر داده‌ها زمانی، وابسته به کاربر یا وابسته به یک سازمان هستند، تقسیم تصادفی ممکن است شرایط استقرار را بازنمایی نکند. در چنین پروژه‌ای باید تفکیک داده را مطابق ترتیب زمانی یا گروه‌های مستقل طراحی کرد.

پیاده‌سازی عملی کالیبراسیون احتمال باPython

در این آموزش یک مسئله دودویی ساختگی می‌سازیم که کلاس مثبت آن کم‌تعدادتر است. سپس Random Forest معمولی را با نسخه‌های کالیبره‌شده به روش Sigmoid و Isotonic مقایسه می‌کنیم.

داده ساختگی امکان اجرای مثال را فراهم می‌کند؛ نتیجه آن را نباید به عملکرد مدل روی پیام‌های واقعی پشتیبانی تعمیم داد.

نصب کتابخانه‌ها

pip install scikit-learn numpy matplotlib

ساخت داده و تفکیک مجموعه‌ها

import numpy as np

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split


X, y = make_classification(
    n_samples=6000,
    n_features=20,
    n_informative=10,
    n_redundant=5,
    weights=[0.90, 0.10],
    flip_y=0.02,
    random_state=42,
)

X_development, X_test, y_development, y_test = (
    train_test_split(
        X,
        y,
        test_size=0.20,
        stratify=y,
        random_state=42,
    )
)

X_train, X_val, y_train, y_val = (
    train_test_split(
        X_development,
        y_development,
        test_size=0.25,
        stratify=y_development,
        random_state=42,
    )
)

print("Train:", len(y_train))
print("Validation:", len(y_val))
print("Test:", len(y_test))

print("Train positive rate:", y_train.mean())
print("Validation positive rate:", y_val.mean())
print("Test positive rate:", y_test.mean())

با این تقسیم، ۶۰ درصد داده‌ها به Train، ۲۰ درصد به Validation و ۲۰ درصد به Test اختصاص می‌یابد. استفاده از stratify کمک می‌کند نسبت تقریبی کلاس‌ها در هر بخش حفظ شود.

در پروژه واقعی باید علاوه بر نسبت کلاس‌ها، جلوگیری از نشت اطلاعات میان نمونه‌های مرتبط را نیز بررسی کرد.

آموزش مدل پایه و دو مدل کالیبره‌شده

from sklearn.calibration import CalibratedClassifierCV
from sklearn.ensemble import RandomForestClassifier


def make_forest():
    return RandomForestClassifier(
        n_estimators=200,
        min_samples_leaf=5,
        n_jobs=-1,
        random_state=42,
    )


plain_model = make_forest()

sigmoid_model = CalibratedClassifierCV(
    estimator=make_forest(),
    method="sigmoid",
    cv=3,
)

isotonic_model = CalibratedClassifierCV(
    estimator=make_forest(),
    method="isotonic",
    cv=3,
)

models = {
    "بدون کالیبراسیون": plain_model,
    "Sigmoid": sigmoid_model,
    "Isotonic": isotonic_model,
}

for name, model in models.items():
    model.fit(X_train, y_train)
    print(f"آموزش {name} تمام شد.")

برای هر گزینه، یک نمونه جداگانه از Random Forest ساخته‌ایم. این کار مقایسه مدل‌ها را روشن‌تر می‌کند و از اشتراک ناخواسته شیء مدل میان آزمایش‌ها جلوگیری می‌کند.

نسخه‌های کالیبره‌شده با cv=3 از تقسیم‌بندی داخلی برای آموزش و کالیبراسیون استفاده می‌کنند. مجموعه Validation بیرونی همچنان برای مقایسه گزینه‌ها کنار گذاشته شده است.

ارزیابی احتمال‌ها رویValidation

from sklearn.metrics import (
    average_precision_score,
    brier_score_loss,
    roc_auc_score,
)


validation_probabilities = {}

for name, model in models.items():
    probabilities = model.predict_proba(X_val)[:, 1]
    validation_probabilities[name] = probabilities

    brier = brier_score_loss(
        y_val,
        probabilities,
    )

    roc_auc = roc_auc_score(
        y_val,
        probabilities,
    )

    average_precision = average_precision_score(
        y_val,
        probabilities,
    )

    print(
        f"{name:20s} | "
        f"Brier: {brier:.4f} | "
        f"ROC AUC: {roc_auc:.4f} | "
        f"Average Precision: {average_precision:.4f}"
    )

هنگام خواندن خروجی:

  • Brierکمتر از دید این معیار بهتر است.
  • ROC AUCبیشتر نشان‌دهنده رتبه‌بندی بهتر است.
  • Average Precisionبیشتر برای بررسی کیفیت بازیابی کلاس مثبت مفید است.

اگر Brier بهتر شود ولی ROC AUC تغییر کمی کند، لزوماً تناقضی وجود ندارد: یک تبدیل احتمال می‌تواند کیفیت عدد احتمال‌ها را تغییر دهد، بی‌آنکه ترتیب بسیاری از نمونه‌ها عوض شود.

ترسیم نمودار کالیبراسیون

import matplotlib.pyplot as plt

from sklearn.calibration import CalibrationDisplay


figure, ax = plt.subplots(
    figsize=(8, 6)
)

for name, probabilities in (
    validation_probabilities.items()
):
    CalibrationDisplay.from_predictions(
        y_val,
        probabilities,
        n_bins=10,
        strategy="quantile",
        name=name,
        ax=ax,
    )

ax.set_title(
    "Probability calibration on validation data"
)

plt.tight_layout()
plt.show()

در این مثال، strategy="quantile" تلاش می‌کند نمونه‌ها را میان بازه‌ها با تعداد تقریباً مشابه تقسیم کند. تعداد بازه‌ها و تعداد نمونه‌های هر بازه را متناسب با اندازه داده انتخاب کنید؛ نمودار حاصل از گروه‌های بسیار کوچک قابل اتکا نیست.

به‌جای قضاوت صرف بر اساس نزدیک بودن ظاهری یک منحنی به قطر نمودار، آن را با Brier Score، نرخ مثبت‌ها و کاربرد عملی احتمال‌ها بررسی کنید.

انتخاب مدل کالیبره‌شده

برای ادامه مثال، گزینه‌ای را که روی Validation کمترین Brier Score دارد انتخاب می‌کنیم:

validation_brier = {
    name: brier_score_loss(
        y_val,
        probabilities,
    )
    for name, probabilities
    in validation_probabilities.items()
}

best_name = min(
    validation_brier,
    key=validation_brier.get,
)

best_model = models[best_name]

val_probabilities = (
    validation_probabilities[best_name]
)

print("Selected model:", best_name)
print(
    "Validation Brier:",
    validation_brier[best_name],
)

این قاعده انتخاب برای مثال آموزشی است. اگر هدف نهایی شما کمینه‌کردن هزینه یک اقدام مشخص باشد، باید هزینه عملیاتی و محدودیت‌های اجرا را نیز در انتخاب مدل لحاظ کنید. پایین‌ترین Brier Score تضمین نمی‌کند یک مدل در هر آستانه یا برای هر تعریف از هزینه، بهترین تصمیم را بسازد.

همچنین اختلاف کوچک میان دو مقدار Brier روی یک Validation محدود ممکن است پایدار نباشد. در پروژه مهم، نتایج را روی بازه‌های زمانی و گروه‌های مستقل نیز بررسی کنید.

آستانه تصمیم چیست؟

یک مدل می‌تواند احتمال ۰٫۳، ۰٫۶ یا ۰٫۹ تولید کند. برای تبدیل احتمال به تصمیم دودویی باید آستانه تعیین شود:

  • احتمال برابر یا بیشتر از آستانه: کلاس مثبت
  • احتمال کمتر از آستانه: کلاس منفی

در بسیاری از کاربردهای معمول طبقه‌بندی دودویی، آستانه پیش‌فرض برای احتمال کلاس مثبت ۰٫۵ است. این مقدار لزوماً بهترین انتخاب برای هدف عملی شما نیست. مستندات scikit-learn نیز تنظیم آستانه را به‌عنوان بخشی جدا از آموزش پیش‌بینی احتمالی توضیح می‌دهد. scikit-learn 1.5.2 documentation

اثر تغییر آستانه

اگر آستانه را پایین بیاورید، معمولاً نمونه‌های بیشتری مثبت تشخیص داده می‌شوند:

  • امکان شناسایی موارد مثبت بیشتر می‌شود.
  • تعداد هشدارهای اشتباه نیز ممکن است افزایش یابد.

اگر آستانه را بالا ببرید، معمولاً نمونه‌های کمتری مثبت تشخیص داده می‌شوند:

  • بار بررسی ممکن است کاهش یابد.
  • احتمال از دست دادن موارد مثبت نیز ممکن است بیشتر شود.

مقدار مناسب به هزینه خطاها و ظرفیت رسیدگی وابسته است.

انتخاب آستانه بر اساس هزینه خطاها

فرض کنید در مثال آموزشی:

  • از دست دادن یک پیام واقعاً فوری، ۵ واحد هزینه دارد.
  • ارجاع اشتباه یک پیام معمولی برای بررسی فوری، ۱ واحد هزینه دارد.

این اعداد صرفاً برای نشان دادن روش‌اند. در کاربرد واقعی باید آن‌ها را با کمک مسئولان فرایند، داده عملیاتی و ظرفیت تیم تعیین کرد.

ابتدا تابع هزینه را می‌نویسیم:

from sklearn.metrics import confusion_matrix


FALSE_NEGATIVE_COST = 5
FALSE_POSITIVE_COST = 1


def decision_cost(
    y_true,
    probabilities,
    threshold,
):
    predictions = (
        probabilities >= threshold
    ).astype(int)

    tn, fp, fn, tp = (
        confusion_matrix(
            y_true,
            predictions,
            labels=[0, 1],
        ).ravel()
    )

    total_cost = (
        FALSE_NEGATIVE_COST * fn
        + FALSE_POSITIVE_COST * fp
    )

    return {
        "threshold": threshold,
        "cost": total_cost,
        "tn": tn,
        "fp": fp,
        "fn": fn,
        "tp": tp,
    }

سپس آستانه‌ها را فقط رویValidation بررسی می‌کنیم:

candidate_thresholds = np.linspace(
    0.05,
    0.95,
    91,
)

threshold_results = [
    decision_cost(
        y_val,
        val_probabilities,
        threshold,
    )
    for threshold
    in candidate_thresholds
]

best_result = min(
    threshold_results,
    key=lambda result: result["cost"],
)

best_threshold = best_result["threshold"]

print("Selected threshold:", best_threshold)
print("Validation cost:", best_result["cost"])
print("Validation FP:", best_result["fp"])
print("Validation FN:", best_result["fn"])

این جست‌وجو آستانه‌ای را بر اساس داده و هزینه فرضی انتخاب می‌کند. مقدار به‌دست‌آمده یک قانون جهانی نیست و به نرخ رخداد، کیفیت مدل و تعریف هزینه بستگی دارد.

برای مقایسه با آستانه۰٫۵:

default_result = decision_cost(
    y_val,
    val_probabilities,
    threshold=0.50,
)

print(
    "Cost at threshold 0.50:",
    default_result["cost"],
)

print(
    "Cost at selected threshold:",
    best_result["cost"],
)

اگر اختلاف هزینه اندک باشد، پیش از تغییر فرایند عملیاتی باید پایداری آن را بررسی کرد.

مشاهده رابطه آستانه و هزینه

threshold_values = [
    result["threshold"]
    for result in threshold_results
]

cost_values = [
    result["cost"]
    for result in threshold_results
]

plt.figure(figsize=(8, 5))

plt.plot(
    threshold_values,
    cost_values,
)

plt.axvline(
    best_threshold,
    color="red",
    linestyle="--",
    label="Selected threshold",
)

plt.xlabel("Decision threshold")
plt.ylabel("Validation cost")
plt.title("Cost across decision thresholds")
plt.legend()

plt.tight_layout()
plt.show()

اگر چند آستانه مجاور هزینه‌ای مشابه دارند، انتخاب آستانه می‌تواند با توجه به پایداری، ظرفیت رسیدگی و سادگی اجرای فرایند انجام شود.

ارزیابی نهایی رویTest

تا اینجا از Test برای انتخاب روش کالیبراسیون یا آستانه استفاده نکرده‌ایم. اکنون مدل و آستانه انتخاب‌شده را یک بار روی آن بررسی می‌کنیم:

from sklearn.metrics import classification_report


test_probabilities = (
    best_model.predict_proba(X_test)[:, 1]
)

test_predictions = (
    test_probabilities >= best_threshold
).astype(int)

test_brier = brier_score_loss(
    y_test,
    test_probabilities,
)

test_roc_auc = roc_auc_score(
    y_test,
    test_probabilities,
)

test_average_precision = (
    average_precision_score(
        y_test,
        test_probabilities,
    )
)

test_result = decision_cost(
    y_test,
    test_probabilities,
    best_threshold,
)

print("Model:", best_name)
print("Threshold:", best_threshold)

print("Test Brier:", test_brier)
print("Test ROC AUC:", test_roc_auc)

print(
    "Test Average Precision:",
    test_average_precision,
)

print("Test FP:", test_result["fp"])
print("Test FN:", test_result["fn"])
print("Test cost:", test_result["cost"])

print(
    classification_report(
        y_test,
        test_predictions,
        digits=4,
        zero_division=0,
    )
)

اگر نتیجه Test ضعیف‌تر از Validation باشد، علت می‌تواند نوسان نمونه‌گیری، بیش‌برازش در انتخاب‌ها یا تفاوت داده‌ها باشد. برای داده واقعی، بررسی خطا به تفکیک زمان، منبع داده و نوع نمونه اهمیت زیادی دارد.

پس از مشاهده Test نباید بارها آستانه و مدل را بر اساس همان مجموعه تغییر داد و همچنان Test را ارزیابی مستقل نامید. برای دور تازه توسعه، به داده ارزیابی مستقل دیگری نیاز خواهید داشت.

آیا تغییر آستانه، مدل را کالیبره می‌کند؟

خیر. تغییر آستانه فقط تعیین می‌کند کدام احتمال‌ها به برچسب مثبت تبدیل شوند.

فرض کنید مدل به گروهی از نمونه‌ها احتمال ۰٫۹ می‌دهد، اما فقط ۶۰ درصد آن‌ها مثبت هستند. با جابه‌جایی آستانه ممکن است تعداد هشدارها مناسب‌تر شود، ولی عدد ۰٫۹ همچنان توصیف دقیقی از فراوانی مشاهده‌شده آن گروه نیست.

به همین ترتیب، کالیبره‌کردن احتمال نیز به‌تنهایی تعیین نمی‌کند چه زمانی باید اقدام کنید. برای تصمیم عملی، هزینه و محدودیت‌های فرایند را وارد انتخاب آستانه کنید.

آیا کالیبراسیون همیشه عملکرد را بهتر می‌کند؟

خیر. کالیبراسیون یک فرضیه قابل آزمایش است، نه تضمین بهبود.

ممکن است:

  • مدل اولیه از قبل خوب کالیبره باشد.
  • داده کالیبراسیون برای روش انتخاب‌شده کافی نباشد.
  • Isotonicروی داده کم بیش‌برازش کند.
  • روش کالیبراسیون بخشی از کیفیت رتبه‌بندی را تغییر دهد.
  • اختلاف مشاهده‌شده روی Validation ناشی از نوسان نمونه‌گیری باشد.
  • داده عملیاتی با داده توسعه تفاوت داشته باشد.

برای همین در مثال، مدل بدون کالیبراسیون را نیز در میان گزینه‌ها نگه داشتیم. انتخاب نهایی از مقایسه تجربی به دست می‌آید.

کالیبراسیون در شبکه‌های عصبی وTemperature Scaling

برای مدل‌های عصبی، Temperature Scaling یکی از روش‌های پس از آموزش برای اصلاح احتمال‌هاست. این روش روی خروجی‌های خام مدل، پیش از تبدیل آن‌ها به احتمال، یک پارامتر دما تنظیم می‌کند.

پژوهش On Calibration of Modern Neural Networks این روش را به‌عنوان راهکاری مؤثر برای کالیبراسیون مدل‌های عصبی بررسی کرده است. بااین‌حال، نتیجه آن پژوهش را نباید تضمین عملکرد برای هر مدل، زبان، داده یا محیط استقرار دانست. proceedings.mlr.press

اگر با مدل طبقه‌بندی متن یا تصویر کار می‌کنید، مراحل کلی چنین‌اند:

  1. مدل اصلی را روی داده آموزش یاد بگیرید.
  2. خروجی خام مدل را روی داده مستقل کالیبراسیون بگیرید.
  3. پارامتر دما را روی همان داده تنظیم کنید.
  4. نمودار کالیبراسیون و معیارهای احتمالی را روی داده مستقل دیگر بسنجید.
  5. آستانه تصمیم را بر اساس هدف کاربرد تنظیم کنید.

اگر احتمال‌ها را از یک API یا سرویس بیرونی می‌گیرید و به خروجی خام مدل دسترسی ندارید، امکان اجرای Temperature Scaling به شکل رایج آن ممکن است وجود نداشته باشد. در آن وضعیت، روش‌های مبتنی بر خروجی قابل دسترس مدل را باید جداگانه ارزیابی کنید.

داده نامتوازن چه اثری بر کالیبراسیون دارد؟

وقتی کلاس مثبت نادر است، خواندن احتمال‌ها دشوارتر می‌شود. برای مثال، احتمال ۰٫۲ برای رویدادی با نرخ پایه ۱ درصد می‌تواند بسیار معنادار باشد، حتی اگر از آستانه پیش‌فرض ۰٫۵ پایین‌تر باشد.

همچنین اقداماتی مانند وزن‌دهی کلاس‌ها یا بازنمونه‌گیری می‌توانند رابطه خروجی مدل با نرخ واقعی رخداد را تغییر دهند. بنابراین بعد از چنین اقداماتی، احتمال‌ها را روی داده‌ای ارزیابی کنید که تا حد امکان شرایط واقعی استفاده را بازنمایی می‌کند.

سه پرسش را جداگانه بررسی کنید:

  • آیا مدل مثبت‌ها را خوب پیدا می‌کند؟
  • آیا احتمال اعلام‌شده قابل اعتماد است؟
  • آیا آستانه انتخاب‌شده تعداد هشدار قابل رسیدگی تولید می‌کند؟

در کاربردهایی که نرخ مثبت‌ها در زمان تغییر می‌کند، کالیبراسیون قبلی نیز ممکن است نیازمند ارزیابی دوباره باشد.

پایش کالیبراسیون پس از استقرار

ارزیابی پیش از استقرار پایان کار نیست. تغییر رفتار کاربران، نوع پیام‌ها، محصول یا شیوه برچسب‌گذاری می‌تواند رابطه احتمال و رخداد واقعی را تغییر دهد.

برای پایش، این موارد را در بازه‌های زمانی مشخص بررسی کنید:

  • نرخ واقعی رخداد کلاس مثبت
  • توزیع احتمال‌های خروجی
  • Brier Scoreروی نمونه‌های دارای برچسب معتبر
  • نمودار کالیبراسیون
  • Precision و Recallدر آستانه عملیاتی
  • تعداد هشدار و زمان رسیدگی
  • اختلاف عملکرد میان گروه‌های مهم داده

اگر برچسب واقعی با تأخیر مشخص می‌شود، گزارش کالیبراسیون را فقط برای نمونه‌هایی بسازید که نتیجه آن‌ها نهایی شده است. در غیر این صورت، نمونه‌های هنوز تعیین‌تکلیف‌نشده می‌توانند تحلیل را منحرف کنند.

اشتباهات رایج

تنظیم کالیبراسیون و ارزیابی روی همان داده

استفاده از یک مجموعه برای آموزش تبدیل احتمال و گزارش عملکرد نهایی، نتیجه‌ای خوش‌بینانه می‌دهد. داده ارزیابی مستقل نگه دارید.

انتخاب آستانه رویTest

با هر بار تنظیم آستانه بر اساس Test، آن مجموعه بخشی از فرایند توسعه می‌شود. آستانه را روی Validation انتخاب کنید.

فرض اینکه ROC AUC بالا یعنی احتمال دقیق

ROC AUC کیفیت رتبه‌بندی را می‌سنجد و به‌تنهایی نشان نمی‌دهد احتمال ۰٫۸ واقعاً با رخداد حدود ۸۰درصدی همراه است.

تفسیر Brier Score به‌عنوان معیار خالص کالیبراسیون

Brier Scoreبرای کیفیت پیش‌بینی احتمالی مفید است، اما عوامل دیگری جز کالیبراسیون نیز بر آن اثر دارند. نمودار کالیبراسیون را هم بررسی کنید.

استفاده از Isotonic با داده کالیبراسیون بسیار کم

انعطاف بالای این روش می‌تواند باعث بیش‌برازش شود. آن را با Sigmoid و مدل اولیه روی داده مستقل مقایسه کنید.

نادیده گرفتن هزینه و ظرفیت تیم

یک آستانه ممکن است Recall خوبی داشته باشد، اما چنان هشدارهای زیادی بسازد که تیم نتواند آن‌ها را بررسی کند. معیار عملیاتی باید با فرایند واقعی هماهنگ باشد.

تعمیم کالیبراسیون یک دوره به همه دوره‌ها

اگر نرخ رخداد یا ویژگی نمونه‌ها تغییر کند، کیفیت احتمال‌ها نیز ممکن است تغییر کند. کالیبراسیون باید پایش شود.

پرسش‌های متداول

کالیبراسیون احتمال در یادگیری ماشین چیست؟

بررسی و در صورت نیاز اصلاح رابطه میان احتمال اعلام‌شده مدل و فراوانی واقعی رخداد است. اگر مدل به گروهی از نمونه‌ها احتمال حدود ۷۰ درصد بدهد، در حالت خوب کالیبره‌شده تقریباً ۷۰ درصد آن گروه باید مثبت باشند.

آیا هر مدل با Accuracy بالا کالیبره است؟

خیر. Accuracy کیفیت برچسب‌های نهایی را در یک آستانه مشخص می‌سنجد و درباره قابل اعتماد بودن عدد احتمال کافی نیست.

تفاوت Calibration و Threshold Tuning چیست؟

Calibration عدد احتمال را ارزیابی یا اصلاح می‌کند. Threshold Tuningتعیین می‌کند از چه احتمالی به بعد یک اقدام یا برچسب مثبت صادر شود.

Reliability Diagramچیست؟

نموداری است که میانگین احتمال پیش‌بینی‌شده را با فراوانی واقعی رخداد در گروه‌های مختلف پیش‌بینی مقایسه می‌کند.

Brier Scoreکمتر بهتر است؟

در مقایسه مدل‌ها روی یک مجموعه داده و یک تعریف یکسان از مسئله، مقدار کمتر از دید Brier Score بهتر است. این معیار را همراه با نمودار کالیبراسیون و معیارهای رتبه‌بندی بررسی کنید.

Sigmoid بهتر است یا Isotonic؟

پاسخ ثابتی وجود ندارد. Sigmoid ساده‌تر است؛ Isotonic انعطاف بیشتری دارد و با داده کم ممکن است بیش‌برازش کند. مقایسه باید روی داده مستقل انجام شود.

آیا آستانه ۰٫۵ همیشه مناسب است؟

خیر. آستانه مناسب به هزینه مثبت کاذب و منفی کاذب، نرخ رخداد و ظرفیت رسیدگی وابسته است.

آیا می‌توان احتمال خروجی مدل زبانی را هم کالیبره کرد؟

اگر یک وظیفه مشخص، برچسب مرجع معتبر و خروجی احتمالی قابل تعریف در اختیار داشته باشید، می‌توان کیفیت احتمال را ارزیابی کرد. ابتدا باید دقیقاً روشن کنید «احتمال چه رویدادی» را می‌سنجید؛ اطمینان زبانی در متن پاسخ به‌خودی‌خود جایگزین احتمال کالیبره‌شده یک رویداد تعریف‌شده نیست.

جمع‌بندی

مدلی که نمونه‌ها را خوب رتبه‌بندی می‌کند، الزاماً احتمال‌های قابل اعتمادی تولید نمی‌کند. کالیبراسیون احتمال بررسی می‌کند آیا عدد اعلام‌شده با فراوانی واقعی رخداد هم‌خوان است. نمودار کالیبراسیون و Brier Score دو ابزار مفید برای این بررسی هستند.

در مثال Python، مدل پایه را با کالیبراسیون Sigmoid و Isotonic مقایسه کردیم، گزینه‌ای را روی Validation انتخاب کردیم و سپس آستانه تصمیم را بر اساس هزینه فرضی خطاها تنظیم کردیم. ارزیابی نهایی نیز روی Test مستقل انجام شد.

در پروژه واقعی، کیفیت این فرایند به تعریف درست رویداد، تفکیک داده بدون نشت، برچسب معتبر، هزینه‌های واقعی و پایش پس از استقرار وابسته است.

کالیبراسیون احتمال در محصولات مبتنی بر هوش مصنوعی

اگر از مدل‌های هوش مصنوعی برای دسته‌بندی پیام، اولویت‌بندی درخواست‌ها یا ساخت جریان بررسی انسانی استفاده می‌کنید، خروجی مدل را روی نمونه‌های واقعی همان کاربرد ارزیابی کنید. سپس مشخص کنید چه خروجی‌ای باید به اقدام خودکار تبدیل شود و کدام موارد به بررسی انسان نیاز دارند.

برای آشنایی با خدمات و راهکارهای هوش مصنوعی درواره و بررسی امکان استفاده از آن‌ها در محصول خود، به darvareh.ir مراجعه کنید.

مقالات مرتبط

منابع

این مقاله صرفاً با هدف آموزش و اطلاع‌رسانی تهیه شده است. پیش از استفاده عملی، مستندات رسمی ابزارها و صفحه سلب مسئولیت درواره را مطالعه کنید.

Read more