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 میتواند اطلاعات دقیقتری درباره توانایی مدل در تفکیک کلاسها ارائه دهد.
امیدوارم این توضیحات کامل و مفید بوده باشند. اگر سوال یا نکته دیگری دارید، لطفاً بفرمایید.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام