شعار زيفيرنت

شرح منحنى ROC

التاريخ:

شرح منحنى ROC

تعلم تصور منحنى ROC في بايثون.


By زولزايا لوفساندورج، عالم البيانات في iSelect

تعد المنطقة الواقعة تحت منحنى ROC أحد المقاييس الأكثر فائدة لتقييم نموذج التصنيف الخاضع للإشراف. يشار إلى هذا المقياس عادةً باسم ROC-AUC. هنا ، تشير ROC إلى خاصية تشغيل جهاز الاستقبال وتقف AUC على المنطقة الواقعة تحت المنحنى. في رأيي ، AUROCC هو اختصار أكثر دقة ولكن ربما لا يبدو لطيفًا. في السياق الصحيح ، يمكن أن تشير AUC أيضًا إلى ROC-AUC على الرغم من أنها يمكن أن تشير إلى المنطقة الواقعة تحت أي منحنى.



تصوير جويل فيليب on Unsplash

 

في هذا المنشور ، سوف نفهم كيف يتم إنشاء منحنى ROC من الناحية المفاهيمية ، وسوف نتخيل المنحنى بتنسيق ثابت وتفاعلي في Python.

فهم المنحنى

 
يوضح لنا منحنى ROC العلاقة بين معدل إيجابي كاذب (ويعرف أيضًا باسم FPR) و  المعدل الإيجابي الحقيقي (المعروف أيضًا باسم TPR) عبر مختلف الحدود القصوى. دعونا نفهم ما يعنيه كل مصطلح من هذه المصطلحات الثلاثة.

أولاً ، لنبدأ بتجديد المعلومات حول شكل مصفوفة الارتباك:



صورة المؤلف

 

بعد تحديث ذاكرتنا في مصفوفة الارتباك ، دعونا نلقي نظرة على المصطلحات.

معدل إيجابي كاذب

 
يمكننا العثور على FPR باستخدام الصيغة البسيطة أدناه:




يخبرنا FPR النسبة المئوية للسجلات السلبية التي تم توقعها بشكل غير صحيح.




صورة المؤلف

المعدل الإيجابي الحقيقي

 
يمكننا العثور على نظام الحماية المؤقت باستخدام الصيغة البسيطة أدناه:




يخبرنا نظام الحماية المؤقت (TPR) النسبة المئوية للسجلات الإيجابية المتوقعة بشكل صحيح. يُعرف هذا أيضًا باسم الاستدعاء أو الحساسية.




صورة المؤلف

عتبة

 
بشكل عام ، يمكن أن يتنبأ نموذج التصنيف باحتمالية كونه فئة معينة لسجل معين. من خلال مقارنة قيمة الاحتمال بقيمة العتبة التي حددناها ، يمكننا تصنيف السجل في فئة. بمعنى آخر ، ستحتاج إلى تحديد قاعدة مشابهة لما يلي:


إذا كانت احتمالية أن تكون إيجابية أكبر من أو تساوي الحد الأدنى ، فسيتم تصنيف السجل على أنه توقع إيجابي ؛ خلاف ذلك ، توقع سلبي.


في المثال الصغير أدناه ، يمكننا أن نرى درجات الاحتمالية لثلاثة سجلات. باستخدام قيمتين حديتين مختلفتين (0.5 و 0.6) ، قمنا بتصنيف كل سجل في فئة. كما ترى ، تختلف الفئات المتوقعة اعتمادًا على قيمة العتبة التي نختارها.



صورة المؤلف

 

عند بناء مصفوفة ارتباك وحساب معدلات مثل FPR و TPR ، نحتاج إلى فئات متوقعة بدلاً من درجات الاحتمالات.

منحنى ROC

 
الآن بعد أن عرفنا ما هي قيم FPR و TPR وقيم العتبة ، فمن السهل أن نفهم ما يظهره منحنى ROC. عند إنشاء المنحنى ، نقوم أولاً بحساب FPR و TPR عبر العديد من قيم العتبة. بمجرد أن يكون لدينا FPR و TPR للعتبات ، فإننا نرسم بعد ذلك FPR على المحور x و TPR على المحور y للحصول على منحنى ROC. هذا هو! ✨



صورة المؤلف

 

تتراوح المساحة الواقعة أسفل منحنى ROC من 0 إلى 1. يحتوي النموذج العشوائي تمامًا على AUROCC يبلغ 0.5 والذي يمثله خط قطري مثلث أزرق متقطع أدناه. كلما كان منحنى ROC بعيدًا عن هذا الخط ، كان النموذج أكثر تنبؤًا.



صورة المؤلف

 

الآن ، حان الوقت لإلقاء نظرة على بعض أمثلة التعليمات البرمجية لتعزيز معرفتنا.

بناء منحنى ROC ثابت في بايثون

 
دعنا أولاً نستورد المكتبات التي نحتاجها لبقية هذا المنشور:

import numpy as np
import pandas as pd
pd.options.display.float_format = "{:.4f}".formatfrom sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, plot_roc_curveimport matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
sns.set(palette='rainbow', context='talk')


الآن سنقوم ببناء دالة ستجد لنا عدد ايجابيات مزيفة و  ايجابيات حقيقية بالنظر إلى الفئة الصحيحة ، الاحتمال المتوقع لكونها فئة موجبة وعتبة:

def get_fp_tp(y, proba, threshold): """Return the number of false positives and true positives.""" # Classify into classes pred = pd.Series(np.where(proba>=threshold, 1, 0), dtype='category') pred.cat.set_categories([0,1], inplace=True) # Create confusion matrix confusion_matrix = pred.groupby([y, pred]).size().unstack() .rename(columns={0: 'pred_0', 1: 'pred_1'}, index={0: 'actual_0', 1: 'actual_1'}) false_positives = confusion_matrix.loc['actual_0', 'pred_1'] true_positives = confusion_matrix.loc['actual_1', 'pred_1'] return false_positives, true_positives


يرجى ملاحظة أنك ستعمل مع مجموعات البيانات المقسمة (مثل التدريب والاختبار) في الواقع. لكننا لن نقسم بياناتنا من أجل البساطة في هذا المنشور.

سنبني نموذجًا بسيطًا على مجموعة بيانات لعبة ونحصل على احتمالات أن تكون موجبة (ممثلة بقيمة 1) للسجلات:

# Load sample data
X = load_breast_cancer()['data'][:,:2] # first two columns only
y = load_breast_cancer()['target']# Train a model
log = LogisticRegression()
log.fit(X, y)# Predict probability
proba = log.predict_proba(X)[:,1]


سنستخدم 1001 حدًا مختلفًا بين 0 و 1 بزيادات قدرها 0.001. بمعنى آخر ، ستبدو قيم العتبة مثل 0 ، 0.001 ، 0.002 ، ... 0.998 ، 0.999 ، 1. لنجد FPR و TPR لقيم العتبة.

# Find fpr & tpr for thresholds
negatives = np.sum(y==0)
positives = np.sum(y==1)columns = ['threshold', 'false_positive_rate', 'true_positive_rate']
inputs = pd.DataFrame(columns=columns, dtype=np.number)
thresholds = np.linspace(0, 1, 1001)for i, threshold in enumerate(thresholds): inputs.loc[i, 'threshold'] = threshold false_positives, true_positives = get_fp_tp(y, proba, threshold) inputs.loc[i, 'false_positive_rate'] = false_positives/negatives inputs.loc[i, 'true_positive_rate'] = true_positives/positives
inputs




بيانات المؤامرة جاهزة. دعنا نرسمها:

def plot_static_roc_curve(fpr, tpr): plt.figure(figsize=[7,7]) plt.fill_between(fpr, tpr, alpha=.5) # Add dashed line with a slope of 1 plt.plot([0,1], [0,1], linestyle=(0, (5, 5)), linewidth=2) plt.xlabel("False Positive Rate") plt.ylabel("True Positive Rate") plt.title("ROC curve"); plot_static_roc_curve(inputs['false_positive_rate'], inputs['true_positive_rate'])




بينما يساعدنا إنشاء وظيفة مخصصة على فهم المنحنى ومدخلاته والتحكم فيها بشكل أفضل ، يمكننا أيضًا الاستفادة منها sklearn القدرات التي تم تحسينها بشكل أكبر. على سبيل المثال ، يمكننا الحصول على FPR و TPR والعتبات بامتداد roc_curve() وظيفة. يمكننا رسم البيانات بنفس الطريقة باستخدام وظيفة الرسم المخصصة لدينا:

fpr, tpr, thresholds = roc_curve(y, proba)
plot_static_roc_curve(fpr, tpr)




سكليرن يوفر أيضا plot_roc_curve() الوظيفة التي تؤدي كل العمل من أجلنا. كل ما تحتاجه هو سطر واحد (إضافة العنوان اختياري):

plot_roc_curve(log, X, y)
plt.title("ROC curve"); # Add a title for clarity




ارسم منحنى ROC التفاعلي في بايثون

 
عند استخدام المخططات الثابتة ، من الصعب رؤية قيمة العتبة المقابلة لنقاط مختلفة عبر المنحنى. خيار واحد هو فحص inputs إطار البيانات الذي أنشأناه. هناك خيار آخر وهو إنشاء نسخة تفاعلية من الرسم البياني حتى نتمكن من رؤية FPR و TPR جنبًا إلى جنب مع قيمة العتبة المقابلة عندما نحوم فوق الرسم البياني:

def plot_interactive_roc_curve(df, fpr, tpr, thresholds): fig = px.area( data_frame=df, x=fpr, y=tpr, hover_data=thresholds, title='ROC Curve' ) fig.update_layout( autosize=False, width=500, height=500, margin=dict(l=30, r=30, b=30, t=30, pad=4), title_x=.5, # Centre title hovermode = 'closest', xaxis=dict(hoverformat='.4f'), yaxis=dict(hoverformat='.4f') ) hovertemplate = 'False Positive Rate=%{x}<br>True Positive Rate=%{y}<br>Threshold=%{customdata[0]:.4f}<extra></extra>' fig.update_traces(hovertemplate=hovertemplate) # Add dashed line with a slope of 1 fig.add_shape(type='line', line=dict(dash='dash'), x0=0, x1=1, y0=0, y1=1) fig.show()plot_interactive_roc_curve(df=inputs, fpr='false_positive_rate', tpr='true_positive_rate', thresholds=['threshold'])




التفاعل مفيد جدًا ، أليس كذلك؟

آمل أن تكون قد استمتعت بتعلم كيفية بناء وتصور منحنى ROC. بمجرد فهم هذا المنحنى ، يصبح من السهل فهم منحنى آخر ذي صلة: منحنى الاستدعاء الدقيق.

شكرا لكم على قراءة هذا المقال. إذا كنت مهتمًا ، فإليك روابط لبعض مشاركاتي الأخرى:

وداعا الآن 🏃💨

 
السيرة الذاتية: زولزايا لوفساندورج يعمل كعالم بيانات في iSelect. عند الانتهاء من BCom كطالب متقدم مع العديد من الجوائز المرموقة ، عملت Zolzaya كمحلل بيانات في شركة استشارية لمدة 3 سنوات قبل الانتقال إلى منصبها الحالي. تحب توسيع معرفتها في علوم البيانات وعلوم الكمبيوتر والإحصاء وشرح مفاهيم علوم البيانات بكلمات بسيطة في مدوناتها.

أصلي. تم إعادة النشر بإذن.

هذا الموضوع ذو علاقة بـ:


أفلاطون. Web3 مُعاد تصوره. تضخيم ذكاء البيانات.

انقر هنا للوصول.

المصدر: https://www.kdnuggets.com/2021/07/roc-curve-explained.html

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة