FA-TOOLS — Header Component

کدهای آماده ارزیابی مدل — accuracy، F1، AUC

رفیق برنامه‌نویس، توی دنیای مدل‌سازی یادگیری ماشین، فقط ساختن یه مدل کافی نیست؛ مهم‌تر اینه که بتونی اون رو درست و حسابی ارزیابی کنی. معیارهایی مثل Accuracy، F1-Score و AUC-ROC ابزارهایی هستن که بهت کمک می‌کنن بفهمی مدلت واقعاً چقدر خوب کار می‌کنه و آیا اصلا قابل اعتماده یا نه. قراره اینجا با هم غرق بشیم تو جزئیات این معیارها، ببینیم هر کدوم کجا به کار میان و مهم‌تر از همه، کدهای آماده و کاربردیشون رو با هم بزنیم که دیگه نیازی نباشه از صفر شروع کنی.


دوست داری ابزارهای برنامه‌نویسی رو یکجا داشته باشی و کلی در وقتت صرفه‌جویی کنی؟ همین الان یه سر به فروشگاه ابزارهای برنامه‌نویسی ما بزن و کدهات رو حرفه‌ای‌تر کن!

🎯 چکیده سریع: معیارهای ارزیابی مدل در یک نگاه 🎯

✓ Accuracy (دقت)

  • ▪️ تعریف: نسبت پیش‌بینی‌های صححیح به کل پیش‌بینی‌ها.
  • ▪️ کاربرد: داده‌های متوازن، نگاه اولیه.
  • ▪️ هشدار: گمراه‌کننده در داده‌های نامتوازن.

✓ F1-Score

  • ▪️ تعریف: میانگین هارمونیک دقت (Precision) و فراخوانی (Recall).
  • ▪️ کاربرد: داده‌های نامتوازون، وقتی هم Positive و هم Negative مهم‌اند.
  • ▪️ مزیت: تعادل بین خطاهای نوع اول و دوم.

✓ AUC-ROC

  • ▪️ تعریف: مساحت زیر منحنی ROC (نمایش عملکرد در آستانه‌های مختلف).
  • ▪️ کاربرد: ارزیابی مدل فارغ از آستانه، مقایسه جامعء مدل‌ها.
  • ▪️ مزیت: حساسیت به تغییر آستانه (Threshold) ندارد.

چرا ارزیابی مدل مهم‌تر از چیزیه که فکرشو می‌کنی؟

کدهای آماده ارزیابی مدل — accuracy، F1، AUC — تصویر 1

فرض کن یه محصول جدید ساختی و کلی هم براش وقت گذاشتی، اما هیچ‌وقت تستش نمی‌کنی ببینی واقعاً کار می‌کنه یا نه. خروجی چیه؟ شکست! دقیقاً همین اتفاق برای مدل‌های یادگیری ماشین هم می‌افته. اگه مدل رو درست ارزیابی نکنی، ممکنه یه مدل ظاهراً عالی رو بندازی تو Production که در عمل عملکرد فاجعه‌باری داره و به جای حل مشکل، برات دردسر درست می‌کنه. انتخاب معیار درست ارزیابی، یعنی اینکه می‌فهمی مدل تو واقعاً داره مشکل رو حل می‌کنه یا فقط داره خودش رو خوب نشون میده. این مرحله، سنگ بنای اعتماد به مدل و تصمیم‌گیری‌های بعدیته.

Accuracy: اولین گام، اما همیشه بهترین نیست!

کدهای آماده ارزیابی مدل — accuracy، F1، AUC — تصویر 2

دقت (Accuracy) چیه؟

Accuracy یا دقت، ساده‌ترین و شاید اولین معیاریه که هر برنامه‌نویسی برای ارزیابی مدل‌های طبقه‌بندی (Classification) سراغش میره. خیلی واضحه: تعداد پیش‌بینی‌های درستی که مدل انجام داده رو تقسیم بر کل پیش‌بینی‌ها می‌کنه. اگه مدلت ۱۰۰ تا پیش‌بینی کرده و ۹۰ تاش درست بوده، Accuracy میشه ۹۰٪. فرمولش هم اینه:

فرمول Accuracy:

Accuracy = (تعداد پیش‌بینی‌های صحیح) / (کل پیش‌بینی‌ها)

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

کد آماده Python برای محاسبه Accuracy:


import numpy as np
from sklearn.metrics import accuracy_score

# مقادیر واقعی (Ground Truth)
y_true = np.array([0, 1, 0, 1, 0, 1, 0, 0, 1, 1])

# مقادیر پیش‌بینی شده توسط مدل
y_pred = np.array([0, 1, 0, 1, 0, 0, 0, 1, 1, 1])

# محاسبه Accuracy
accuracy = accuracy_score(y_true, y_pred)

print(f"Accuracy مدل: {accuracy:.2f}") # خروجی: Accuracy مدل: 0.80
    

برای اسنیپت‌های بیشتر پایتون، اینجا رو ببینید!

کی Accuracy به دردسر می‌ندازتمون؟

مشکل Accuracy وقتی شروع میشه که داده‌هات نامتوازون (Imbalanced) باشن. مثلاً فرض کن داری یه مدل می‌سازی برای تشخیص بیماری سرطان که فقط ۱٪ از جامعه بهش مبتلا هستن. اگه مدل تو همیشه بگه “این شخص سرطان نداره”، Accuracy مدل میشه ۹۹٪! ظاهراً خیلی خوبه، نه؟ اما در عمل، مدلی کاملاً بی‌مصرفه، چون نتونسته هیچ‌کدوم از بیماران واقعی رو تشخیص بده. اینجا Accuracy یه معیار گول‌زننده است.

F1-Score: تعادل بین دقت و فراخوانی

F1-Score دقیقاً چیه؟

وقتی Accuracy کم میاره، F1-Score وارد میدون میشه. F1-Score یه معیار ترکیبیه که سعی می‌کنه بین دو چیز تعادل برقرار کنه: Precision (دقت) و Recall (فراخوانی).

  • Precision (دقت): از بین چیزهایی که مدل به عنوان “مثبت” پیش‌بینی کرده، چندتاش واقعاً مثبت بودن؟ (چقدر مدل در پیش‌بینی‌های مثبتش دقیق عمل کرده؟)
  • Recall (فراخوانی): از بین همه چیزهای که واقعاً “مثبت” بودن، مدل چندتاش رو تونسته تشخیص بده؟ (چقدر مدل تونسته همه مثبت‌های واقعی رو “صید” کنه؟)

F1-Score میانگین هارمونیک این دوتاست. یعنی اگه یکی از این دوتا (Precision یا Recall) خیلی پایین باشه، F1-Score هم پایین میاد. این معیار وقتی فوق‌العاده کاربردیه که خطاهای نوع اول (False Positives) و خطاهای نوع دوم (False Negatives) هر دو به یه اندازه مهم باشن، مثلاً در تشخیص بیماری‌ها یا شناسایی کلاهبرداری‌های مالی.

فرمول F1-Score:

F1-Score = 2 * (Precision * Recall) / (Precision + Recall)

کد آماده Python برای محاسبه F1-Score:


import numpy as np
from sklearn.metrics import f1_score

# مقادیر واقعی (Ground Truth)
y_true = np.array([0, 1, 0, 1, 0, 1, 0, 0, 1, 1])

# مقادیر پیش‌بینی شده توسط مدل
y_pred = np.array([0, 1, 0, 1, 0, 0, 0, 1, 1, 1])

# محاسبه F1-Score (برای کلاس 1)
# 'pos_label=1' مشخص می‌کند که کلاس مثبت ما کدام است.
# 'average='binary' برای حالت دو کلاسه
f1 = f1_score(y_true, y_pred, average='binary', pos_label=1)

print(f"F1-Score مدل: {f1:.2f}") # خروجی: F1-Score مدل: 0.75
    

کدهای بیشتری در مورد اسنیپت‌های مختلف رو می‌تونی تو مخزن اسنیپت‌های ما پیدا کنی!

چرا F1 وقتی داده‌هامون نامتوازون‌اند نجات‌بخشه؟

برگردیم به مثال سرطان. اگه مدل ما فقط بگه “سرطان نداره”، Precision میشه ۰ (چون حتی یک مورد مثبت هم که تشخیص داده، غلط بوده)، و Recall هم میشه ۰ (چون هیچ‌کدوم از بیماران واقعی رو تشخیص نداده). نتیجه؟ F1-Score هم میشه ۰. اینجوری مدل بی‌مصرف ما دیگه ۹۹٪ خوب نشون داده نمیشه و ما می‌فهمیم که مدلمون عملاً هیچ کاری نکرده. F1-Score به خصوص برای زمانی که کلاس‌های اقلیت (Minority Class) براتون اهمیت ویژه‌ای دارن، یه راه نجاته.

AUC-ROC: جامع‌ترین نگاه به عملکرد مدل

منحنی ROC و مفهوم AUC

Area Under the Receiver Operating Characteristic Curve یا به اختصار AUC-ROC یه معیار قدرتمنده که عملکرد مدل رو در تمام آستانه‌های (Threshold) ممکن ارزیابی می‌کنه. منحنی ROC، یه نمودار دو بعدی از نرخ مثبت واقعی (True Positive Rate – TPR یا Recall) در برابر نرخ مثبت کاذب (False Positive Rate – FPR) در آستانه‌های مختلف طبقه‌بندی مدل رو نشون میده. FPR یعنی از بین چیزهایی که واقعاً منفی بودن، مدلمون چندتاش رو اشتباهی مثبت تشخیص داده.

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

نکته کلیدی AUC-ROC:

مقدار AUC بین ۰ تا ۱ متغیره. هرچی به ۱ نزدیک‌تر باشه، مدل قدرت تفکیک بالاتری داره.

کد آماده Python برای محاسبه AUC-ROC:


import numpy as np
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt # برای رسم منحنی ROC

# مقادیر واقعی (Ground Truth)
y_true = np.array([0, 1, 0, 1, 0, 1, 0, 0, 1, 1])

# احتمالات پیش‌بینی شده برای کلاس مثبت (احتمال اینکه 1 باشد)
# این‌ها معمولاً خروجی متدهای `predict_proba` مدل‌ها هستند.
y_scores = np.array([0.1, 0.9, 0.2, 0.8, 0.3, 0.4, 0.1, 0.6, 0.9, 0.7])

# محاسبه AUC
auc = roc_auc_score(y_true, y_scores)

print(f"AUC مدل: {auc:.2f}") # خروجی: AUC مدل: 0.89 (ممکنه با مثال شما کمی متفاوت باشه)

# برای رسم منحنی ROC:
# fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# plt.figure(figsize=(8, 6))
# plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {auc:.2f})')
# plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
# plt.xlim([0.0, 1.0])
# plt.ylim([0.0, 1.05])
# plt.xlabel('False Positive Rate')
# plt.ylabel('True Positive Rate')
# plt.title('Receiver Operating Characteristic')
# plt.legend(loc="lower right")
# plt.grid(True)
# plt.show()
    

چه زمانی AUC-ROC انتخاب هوشمندانه‌ایه؟

AUC-ROC به خصوص زمانی مفیده که:

  • داده‌هات نامتوازن هستن.
  • می‌خوای عملکرد مدل رو فارغ از اینکه چه آستانه (Threshold) خاصی رو برای طبقه‌بندی انتخاب می‌کنی، ببینی.
  • قصد داری چند مدل مختلف رو با هم مقایسه کنی و ببینی کدوم یکی بهتر کلاس‌ها رو از هم جدا می‌کنه.

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

در عمل: کدنویسی برای ارزیابی سریع (با Scikit-learn)

خب، حالا که با مفاهیم آشنا شدی، بریم سراغ یه اسنیپت کامل و کاربردی با `Scikit-learn` که تمام این معیارها رو یکجا برات محاسبه می‌کنه. این کد یه دیتای ساختگی رو در نظر می‌گیره، اما به راحتی می‌تونی با `y_true` (لیبل‌های واقعی) و `y_pred` (پیش‌بینی‌های مدل) یا `y_probs` (احتمالات مدل) خودت جایگزینش کنی.

اسنیپت جامع ارزیابی مدل:


import numpy as np
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, classification_report, confusion_matrix

# فرض می‌کنیم اینها لیبل‌های واقعی و پیش‌بینی‌های مدل شما هستند
# y_true: لیبل‌های واقعی
# y_pred: لیبل‌های پیش‌بینی شده توسط مدل (0 یا 1)
# y_probs: احتمالاتی که مدل برای کلاس مثبت (1) پیش‌بینی کرده

# مثال با داده‌های ساختگی:
y_true = np.array([0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1])
y_pred = np.array([0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1])
y_probs = np.array([0.1, 0.9, 0.2, 0.8, 0.3, 0.4, 0.1, 0.6, 0.9, 0.7, 0.2, 0.85, 0.15, 0.3, 0.95, 0.75, 0.05, 0.55, 0.25, 0.8])

# 1. محاسبه Accuracy
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 2. محاسبه F1-Score
# برای F1-score، اگر چند کلاسه دارید از average='weighted', 'macro' یا 'micro' استفاده کنید.
# برای حالت دو کلاسه 'binary' مناسب است.
f1 = f1_score(y_true, y_pred, average='binary', pos_label=1)
print(f"F1-Score (برای کلاس 1): {f1:.2f}")

# 3. محاسبه AUC-ROC
auc = roc_auc_score(y_true, y_probs)
print(f"AUC-ROC: {auc:.2f}")

# --- گزارش‌های تکمیلی (بسیار مفید!) ---

# ماتریس درهم‌ریختگی (Confusion Matrix)
# بهت نشون میده که مدل چند تا True Positive, True Negative, False Positive, False Negative داشته.
conf_matrix = confusion_matrix(y_true, y_pred)
print("nConfusion Matrix:")
print(conf_matrix)
# خروجی:
# [[TN, FP],
#  [FN, TP]]

# گزارش طبقه‌بندی (Classification Report)
# شامل Precision, Recall, F1-Score برای هر کلاس و میانگین‌ها
class_report = classification_report(y_true, y_pred)
print("nClassification Report:")
print(class_report)
    

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

جدول مقایسه سریع: کی از کدوم استفاده کنیم؟

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

معیار بهترین زمان استفاده
Accuracy (دقت) کلاس‌ها تقریباً متوازن‌اند، هزینه False Positive و False Negative تقریباً برابره، و نیاز به یه نگاه کلی اولیه داری.
F1-Score داده‌ها نامتوازن‌اند، یا هزینه False Positive و False Negative مهم و تقریباً با هم برابرند (مثل تشخیص بیماری یا کلاهبرداری).
AUC-ROC می‌خوای عملکرد مدل رو مستقل از آستانه (Threshold) طبقه‌بندی ببینی، داده‌ها نامتوازن‌اند، یا چندین مدل رو با هم مقایسه می‌کنی.

مشکلات رایج و راه‌حل‌ها (Troubleshooting)

هر برنامه‌نویسی با ارزیابی مدل سروکار داره، با چالش‌هایی هم روبرو میشه. بیا چندتا از رایج‌ترین مشکلات و راه حل‌های سریعشون رو بررسی کنیم:

مدلم Accuracy بالایی داره ولی خروجی خوبی نمیده!

این دقیقاً همون سناریوی داده‌های نامتوازن و گول‌زننده بودن Accuracy است.

راه حل:

  • Accuracy رو کنار بذار و سراغ معیارهایی مثل F1-Score، Precision، Recall یا AUC-ROC برو.
  • ماتریس درهم‌ریختگی (Confusion Matrix) رو بررسی کن تا ببینی مدل تو کدوم کلاس‌ها مشکل داره (False Positive یا False Negative زیادی داره).
  • روش‌های مقابله با عدم توازن داده‌ها مثل Oversampling (SMOTE) یا Undersampling رو امتحان کن.

نمی‌دونم چه آستانه‌ای (Threshold) برای مدل انتخاب کنم.

انتخاب آستانه (مثلاً 0.5 برای کلاس‌بندی با احتمالات) می‌تونه تأثیر زیادی روی عملکرد نهایی مدل داشته باشه.

راه حل:

  • از منحنی ROC استفاده کن. این منحنی بهت نشون میده چطور با تغییر آستانه، نرخ مثبت واقعی (TPR) و نرخ مثبت کاذب (FPR) تغییر می‌کنن. می‌تونی یه آستانه انتخاب کنی که تعادل خوبی بین این دو ایجاد کنه.
  • از منحنی Precision-Recall (PR Curve) استفاده کن، مخصوصاً اگه داده‌هات نامتوازن هستن. این منحنی هم بهت کمک می‌کنه تا بهترین آستانه رو پیدا کنی.
  • بر اساس هزینه‌های تجاری (Business Costs) تصمیم بگیر. اگه هزینه False Negative خیلی بالاتره (مثلاً تشخیص ندادن بیماری)، ممکنه بخوای آستانه رو پایین‌تر بیاری تا Recall رو بالا ببری، حتی اگه Precision کمی افت کنه.

کدم ارور میده یا خروجی اشتباه میده.

این یه مشکل کلی‌تره که معمولاً تو مراحل اولیه پیاده‌سازی پیش میاد.

راه حل:

  • مطمئن شو که ورودی‌های توابع مثل `y_true`, `y_pred` و `y_probs` از تایپ داده‌ای صحیح (معمولاً آرایه‌های NumPy یا لیست‌های پایتون) و شکل (Shape) مناسبی برخوردارند.
  • پاراتمرهای توابع Scikit-learn رو با دقت چک کن. مثلاً `pos_label` در `f1_score` یا `average` در `f1_score` برای سناریوی شما صحیح باشه.
  • ورژن `scikit-learn` رو چک کن. گاهی اوقات تغییرات بین ورژن‌ها می‌تونه باعث بروز مشکل بشه.
  • از مخزن اسنیپت‌های ما کمک بگیر. شاید یک اسنیپت آماده بتونه مشکل نرم‌افذاری تو رو حل کنه!

جمع‌بندی: یه رفیق خوب برای انتخاب معیار ارزیابی

یادت باشه، هیچ معیار “بهترین” مطلقی برای ارزیابی مدل وجود نداره. انتخاب درست کاملاً بستگی به نوع مشکل، ماهیت داده‌ها و مهم‌تر از همه، هدف تجاری یا علمی پروژه تو داره. با شناخت دقیق Accuracy، F1-Score و AUC-ROC و تسلط بر کدهای آماده‌شون، حالا یه جعبه ابزار کامل برای ارزیابی دقیق مدل‌هات داری. این ابزارها بهت کمک می‌کنن تا تصمیمات آگاهانه‌تری بگیری و مدل‌هایی بسازی که واقعاً تو دنیای واقعی ارزشمند باشن.

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

Table of Contents

آخرین نوشته‌ها