بازگشت به دوره

آموزش رایگان صفر تا صد یادگیری ماشین (Machine Learning) به زبان ساده

0% تکمیل‌شده
0/0 مرحله

منحنی AUC – ROC یکی از مهم‌ترین ابزارهای ارزیابی مدل‌های دسته‌بندی (Classification) است. اگر می‌خواهید بدانید مدل شما چقدر خوب می‌تواند بین کلاس‌های مختلف تمایز قائل شود، این مفهوم را باید بشناسید! 🚀


📌 فهرست مطالب

 

🎯 ارزیابی مدل‌های دسته‌بندی

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

گاهی داده‌های ما نامتوازن (Imbalanced Data) هستند؛ یعنی تعداد نمونه‌های یک کلاس بیشتر از کلاس دیگر است. در چنین شرایطی، ممکن است مدلی که فقط اکثریت را پیش‌بینی کند، دقت بالایی داشته باشد اما عملاً بی‌فایده باشد! 😕

📊 در یادگیری ماشین AUC – ROC چیست؟

AUC (مساحت زیر منحنی) در واقع مقدار عددی است که کیفیت یک مدل را از نظر تفکیک کلاس‌ها اندازه‌گیری می‌کند. ROC (منحنی مشخصه عملکرد گیرنده) نرخ مثبت‌های واقعی (True Positive Rate) را در مقابل نرخ مثبت‌های کاذب (False Positive Rate) در سطوح مختلف آستانه نمایش می‌دهد.

🔹 مفهوم ساده‌تر: AUC نشان می‌دهد که مدل چقدر خوب می‌تواند بین کلاس‌ها تمایز قائل شود. مقدار آن بین ۰ تا ۱ است:

  • AUC = 0.5 ➖ مدل عملکردی مثل پرتاب سکه دارد و کاملاً تصادفی است.

  • AUC نزدیک به ۱ ✅ مدل بسیار خوب عمل می‌کند و به درستی کلاس‌ها را تفکیک می‌کند.

  • AUC نزدیک به ۰ ❌ مدل عملکرد ضعیفی دارد و حتی برعکس کار می‌کند!

🏆 مثال: داده‌های نامتوازن

فرض کنید مجموعه داده‌ای داریم که ۹۵٪ آن مربوط به کلاس ۱ و ۵٪ آن مربوط به کلاس ۰ است. اگر مدلی داشته باشیم که همیشه کلاس ۱ را پیش‌بینی کند، دقت آن بسیار بالا خواهد بود، اما اطلاعاتی درباره کلاس ۰ نمی‌دهد!

📌 کد پایتون برای بررسی این موضوع:

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

n = 10000  # تعداد نمونه‌ها
ratio = 0.95  # نسبت کلاس ۱
n_0 = int((1 - ratio) * n)  # تعداد نمونه‌های کلاس ۰
n_1 = int(ratio * n)  # تعداد نمونه‌های کلاس ۱

y = np.array([0] * n_0 + [1] * n_1)
y_proba = np.array([1] * n)  # مدل همیشه کلاس ۱ را پیش‌بینی می‌کند
y_pred = y_proba > 0.5

print(f'Accuracy: {accuracy_score(y, y_pred)}')
print(f'AUC Score: {roc_auc_score(y, y_proba)}')

✅ این مدل دقت بالا اما AUC پایینی دارد زیرا فقط یک کلاس را شناسایی کرده است.

📈 نمایش منحنی ROC

برای درک بهتر، می‌توان منحنی ROC را رسم کرد:

import matplotlib.pyplot as plt

def plot_roc_curve(true_y, y_prob):
    fpr, tpr, _ = roc_curve(true_y, y_prob)
    plt.plot(fpr, tpr, label=f'AUC: {roc_auc_score(true_y, y_prob):.2f}')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.legend()
    plt.show()

📌 حالا بیایید دو مدل مختلف را مقایسه کنیم:

# مدل ۱: پیش‌بینی همیشه کلاس ۱
plot_roc_curve(y, y_proba)
print(f'Model 1 AUC: {roc_auc_score(y, y_proba)}')

# مدل ۲: پیش‌بینی با احتمال‌های واقعی‌تر
y_proba_2 = np.array(
    np.random.uniform(0, 0.7, n_0).tolist() +
    np.random.uniform(0.3, 1, n_1).tolist()
)
plot_roc_curve(y, y_proba_2)
print(f'Model 2 AUC: {roc_auc_score(y, y_proba_2)}')

🔍 چرا AUC از دقت بهتر است؟

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

💡 سوال برای شما: اگر مدلی دقت بالایی دارد اما AUC آن کم است، آیا این مدل را برای یک پروژه مهم انتخاب می‌کنید؟ چرا؟ 🤔

🎯 جمع‌بندی

  • AUC – ROC ابزاری عالی برای ارزیابی مدل‌های دسته‌بندی است.

  • اگر داده‌های نامتوازن دارید، دقت به تنهایی کافی نیست! از AUC استفاده کنید.

  • هر چه AUC بالاتر باشد، مدل بهتر کلاس‌ها را تفکیک می‌کند.

  • برای مقایسه مدل‌ها، منحنی ROC را رسم کنید و مقدار AUC را در نظر بگیرید.