منحنی AUC-ROC (AUC-ROC Curve)
منحنی AUC-ROC برای سنجش مدل طبقه بندی است. دقت فقط درست گویی را می سنجد. اما AUC-ROC میزان جداسازی دو کلاس را می سنجد. بنابراین وقتی داده نامتوازن است، معیار بهتری می شود.
AUC و ROC یعنی چه؟
«ROC Curve» نرخ مثبتِ درست (TPR) را مقابل نرخ مثبتِ کاذب (FPR) می کشد. «AUC» مساحت زیر این منحنی است. هرچه AUC به 1 نزدیک تر باشد، جداسازی کلاس ها بهتر است.
- آستانه های گوناگون را امتحان کن.
- برای هر آستانه، TPR و FPR را بسنج.
- منحنی را رسم کن و AUC را محاسبه کن.
نکته: اگر داده نامتوازن است، از اعتبارسنجی متقابل استفاده کن تا ارزیابی پایدارتر شود.
داده نامتوازن و مشکل دقت
گاهی یک مدل فقط کلاس غالب را حدس می زند و دقت بالا می گیرد. اما این مدل هیچ چیزی یاد نگرفته است.
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_auc_score
from sklearn.metrics import 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("accuracy score:", accuracy_score(y, y_pred))
cf_mat = confusion_matrix(y, y_pred)
print("Confusion matrix")
print(cf_mat)
print("class 0 accuracy:", cf_mat[0][0] / n_0)
print("class 1 accuracy:", cf_mat[1][1] / n_1)
حالا یک مدل کمی بهتر می سازیم که همیشه کلاس غالب را نگوید.
y_proba_2 = np.array(
np.random.uniform(0.0, 0.7, n_0).tolist() +
np.random.uniform(0.3, 1.0, n_1).tolist()
)
y_pred_2 = y_proba_2 > 0.5
print("accuracy score:", accuracy_score(y, y_pred_2))
cf_mat = confusion_matrix(y, y_pred_2)
print("Confusion matrix")
print(cf_mat)
print("class 0 accuracy:", cf_mat[0][0] / n_0)
print("class 1 accuracy:", cf_mat[1][1] / n_1)
تعریف تابع رسم ROC
با یک تابع ساده، منحنی ROC را می کشیم. سپس AUC را می سنجیم.
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
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")
مقایسه دو مدل با AUC
مدل 1 همیشه کلاس غالب را می گوید. AUC آن باید نزدیک 0٫5 باشد.
plot_roc_curve(y, y_proba)
print("model 1 AUC score:", roc_auc_score(y, y_proba))
مدل 2 احتمال ها را واقعی تر می دهد. AUC بزرگ تر می شود.
plot_roc_curve(y, y_proba_2)
print("model 2 AUC score:", roc_auc_score(y, y_proba_2))
وقتی دقت برابر است، AUC تصمیم می گیرد
دو مدل با دقت های مشابه را بساز. سپس AUC را مقایسه کن.
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
n = 10000
y = np.array([0] * n + [1] * n)
y_prob_1 = np.array(
np.random.uniform(0.25, 0.5, n // 2).tolist() +
np.random.uniform(0.3, 0.7, n).tolist() +
np.random.uniform(0.5, 0.75, n // 2).tolist()
)
y_prob_2 = np.array(
np.random.uniform(0.0, 0.4, n // 2).tolist() +
np.random.uniform(0.3, 0.7, n).tolist() +
np.random.uniform(0.6, 1.0, n // 2).tolist()
)
print("model 1 accuracy score:", accuracy_score(y, y_prob_1 > 0.5))
print("model 2 accuracy score:", accuracy_score(y, y_prob_2 > 0.5))
print("model 1 AUC score:", roc_auc_score(y, y_prob_1))
print("model 2 AUC score:", roc_auc_score(y, y_prob_2))
منحنی مدل 1 را رسم کن و شکل آن را ببین.
plot_roc_curve(y, y_prob_1)
حالا منحنی مدل 2 را بکش و مقایسه کن.
fpr, tpr, thresholds = roc_curve(y, y_prob_2)
plt.plot(fpr, tpr)
جمع بندی سریع
- AUC نزدیک 1 یعنی جداسازی عالی.
- AUC نزدیک 0٫5 یعنی حدس تصادفی.
- وقتی داده نامتوازن است، AUC مهم تر است.
- احتمال های مطمئن تر، AUC را افزایش می دهند.
نکته: برای تمرین بیشتر، صفحه اعتبارسنجی متقابل را ببین. همچنین درباره بگینگ بخوان. اگر می خواهی بیشتر بدانی، این مطلب را با کلیدواژه منحنی AUC-ROC هم مرور کن.