Python – نمودار AUC – ROC (AUC – ROC Curve)

AUC - ROC Curve

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

مفاهیم کلیدی:

  • True Positive Rate (TPR) یا Sensitivity: نسبت نمونه‌های مثبت که به درستی شناسایی شده‌اند.
  • False Positive Rate (FPR): نسبت نمونه‌های منفی که به اشتباه به عنوان مثبت شناسایی شده‌اند.
  • ROC Curve: منحنی‌ای که TPR را در برابر FPR در آستانه‌های مختلف رسم می‌کند.
  • AUC: مساحت زیر منحنی ROC که از ۰ تا ۱ متغیر است. AUC نزدیک به ۱ نشان‌دهنده عملکرد خوب مدل است و AUC نزدیک به ۰.۵ نشان‌دهنده عدم توانایی مدل در تفکیک کلاس‌ها است.

مراحل اجرای AUC - ROC Curve:

  • تنظیمات اولیه:
import numpy as np
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt

# داده‌های ساختگی
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 score: {accuracy_score(y, y_pred)}')
cf_mat = confusion_matrix(y, y_pred)
print('Confusion matrix:')
print(cf_mat)
print(f'Class 0 accuracy: {cf_mat[0][0] / n_0}')
print(f'Class 1 accuracy: {cf_mat[1][1] / n_1}')

نتیجه: دقت بسیار بالا است اما مدل به دلیل عدم تفکیک درست کلاس‌ها در عمل مفید نیست.

  • مدل دوم (پیش‌بینی با احتمال‌های تصادفی):

y_proba_2 = np.array(
    np.random.uniform(0, 0.7, n_0).tolist() +
    np.random.uniform(0.3, 1, n_1).tolist()
)
y_pred_2 = y_proba_2 > 0.5

print(f'Accuracy score: {accuracy_score(y, y_pred_2)}')
cf_mat = confusion_matrix(y, y_pred_2)
print('Confusion matrix:')
print(cf_mat)
print(f'Class 0 accuracy: {cf_mat[0][0] / n_0}')
print(f'Class 1 accuracy: {cf_mat[1][1] / n_1}')

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

  • محاسبه و رسم منحنی ROC:

def plot_roc_curve(true_y, y_prob):
    fpr, tpr, thresholds = roc_curve(true_y, y_prob)
    plt.plot(fpr, tpr)
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')

# مدل 1
plot_roc_curve(y, y_proba)
print(f'Model 1 AUC score: {roc_auc_score(y, y_proba)}')

# مدل 2
plot_roc_curve(y, y_proba_2)
print(f'Model 2 AUC score: {roc_auc_score(y, y_proba_2)}')

نتایج:

  • مدل 1 دارای AUC نزدیک به 0.5 است که نشان‌دهنده عدم توانایی مدل در تفکیک کلاس‌ها است.
  • مدل 2 دارای AUC بالاتر از 0.8 است که نشان‌دهنده توانایی بهتر مدل در تفکیک کلاس‌ها است.

نتیجه‌گیری:

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

امیدوارم این توضیحات کامل و مفید بوده باشند. اگر سوال یا نکته دیگری دارید، لطفاً بفرمایید.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
Python - محدود کردن داده (MongoDB Limit)

Python – محدود کردن داده (MongoDB Limit)

Python MongoDB محدود کردن نتایج برای محدود کردن نتایج در MongoDB، از متد limit() استفاده می‌کنیم. متد limit() یک...

بیشتر بخوانید
Python - بروزرسانی (MongoDB Update)

Python – بروزرسانی (MongoDB Update)

به‌روزرسانی یک رکورد برای به‌روزرسانی یک رکورد یا سند در MongoDB، از متد update_one() استفاده می‌کنیم. پارامتر اول متد...

بیشتر بخوانید
Python - حذف کالکشن (MongoDB Drop Collection)

Python – حذف کالکشن (MongoDB Drop Collection)

حذف کالکشن شما می‌توانید یک جدول یا کالکشن در MongoDB را با استفاده از متد drop() حذف کنید. مثالحذف...

بیشتر بخوانید

نظرات

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

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.