28 KiB
الانحدار اللوجستي للتنبؤ بالفئات
اختبار ما قبل المحاضرة
هذا الدرس متوفر بلغة R!
المقدمة
في هذا الدرس الأخير حول الانحدار، وهو أحد تقنيات تعلم الآلة الكلاسيكية الأساسية، سنلقي نظرة على الانحدار اللوجستي. يمكنك استخدام هذه التقنية لاكتشاف الأنماط للتنبؤ بالفئات الثنائية. هل هذه الحلوى تحتوي على شوكولاتة أم لا؟ هل هذا المرض معدٍ أم لا؟ هل سيختار هذا العميل هذا المنتج أم لا؟
في هذا الدرس، ستتعلم:
- مكتبة جديدة لتصور البيانات
- تقنيات الانحدار اللوجستي
✅ عمّق فهمك للعمل مع هذا النوع من الانحدار في وحدة التعلم هذه
المتطلبات الأساسية
بعد العمل مع بيانات القرع، أصبحنا الآن على دراية كافية بها لندرك أن هناك فئة ثنائية يمكننا العمل معها: اللون
.
دعونا نبني نموذج انحدار لوجستي للتنبؤ بذلك، بناءً على بعض المتغيرات، ما هو اللون المحتمل للقرع المعطى (برتقالي 🎃 أو أبيض 👻).
لماذا نتحدث عن التصنيف الثنائي في درس حول الانحدار؟ فقط لتسهيل اللغة، حيث أن الانحدار اللوجستي هو في الواقع طريقة تصنيف، وإن كانت تعتمد على الخطية. تعرّف على طرق أخرى لتصنيف البيانات في مجموعة الدروس التالية.
تحديد السؤال
لأغراضنا، سنعبر عن هذا كفئة ثنائية: "أبيض" أو "ليس أبيض". هناك أيضًا فئة "مخطط" في مجموعة البيانات الخاصة بنا، ولكن هناك عدد قليل من الحالات منها، لذلك لن نستخدمها. على أي حال، تختفي بمجرد إزالة القيم الفارغة من مجموعة البيانات.
🎃 معلومة ممتعة، أحيانًا نطلق على القرع الأبيض "قرع الأشباح". إنها ليست سهلة النحت، لذا فهي ليست شائعة مثل البرتقالية، لكنها تبدو رائعة! لذلك يمكننا أيضًا إعادة صياغة سؤالنا كالتالي: "شبح" أو "ليس شبح". 👻
حول الانحدار اللوجستي
يختلف الانحدار اللوجستي عن الانحدار الخطي، الذي تعلمته سابقًا، في بعض الجوانب المهمة.
🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن الانحدار اللوجستي.
التصنيف الثنائي
لا يقدم الانحدار اللوجستي نفس ميزات الانحدار الخطي. الأول يقدم تنبؤًا بفئة ثنائية ("أبيض أو ليس أبيض") بينما الثاني قادر على التنبؤ بالقيم المستمرة، على سبيل المثال بناءً على أصل القرع ووقت الحصاد، كم سيرتفع سعره.
رسم توضيحي بواسطة داساني ماديبالي
تصنيفات أخرى
هناك أنواع أخرى من الانحدار اللوجستي، بما في ذلك متعدد الفئات والمرتب:
- متعدد الفئات، الذي يتضمن وجود أكثر من فئة - "برتقالي، أبيض، ومخطط".
- المرتب، الذي يتضمن فئات مرتبة، وهو مفيد إذا أردنا ترتيب النتائج منطقيًا، مثل القرع الذي يتم ترتيبه حسب عدد محدود من الأحجام (صغير جدًا، صغير، متوسط، كبير، كبير جدًا، ضخم).
المتغيرات لا تحتاج إلى الارتباط
تذكر كيف كان الانحدار الخطي يعمل بشكل أفضل مع المتغيرات الأكثر ارتباطًا؟ الانحدار اللوجستي هو العكس - المتغيرات لا تحتاج إلى التوافق. وهذا يناسب هذه البيانات التي تحتوي على ارتباطات ضعيفة إلى حد ما.
تحتاج إلى الكثير من البيانات النظيفة
سيعطي الانحدار اللوجستي نتائج أكثر دقة إذا استخدمت المزيد من البيانات؛ مجموعة البيانات الصغيرة لدينا ليست مثالية لهذه المهمة، لذا ضع ذلك في اعتبارك.
✅ فكر في أنواع البيانات التي يمكن أن تكون مناسبة للانحدار اللوجستي
التمرين - تنظيف البيانات
أولاً، قم بتنظيف البيانات قليلاً، بإزالة القيم الفارغة واختيار بعض الأعمدة فقط:
-
أضف الكود التالي:
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplace=True)
يمكنك دائمًا إلقاء نظرة على إطار البيانات الجديد الخاص بك:
pumpkins.info
التصور - مخطط الفئات
بحلول الآن، قمت بتحميل دفتر الملاحظات المبدئي مع بيانات القرع مرة أخرى وقمت بتنظيفه للحفاظ على مجموعة بيانات تحتوي على بعض المتغيرات، بما في ذلك اللون
. دعنا نتصور إطار البيانات في دفتر الملاحظات باستخدام مكتبة مختلفة: Seaborn، التي تعتمد على Matplotlib التي استخدمناها سابقًا.
يوفر Seaborn طرقًا رائعة لتصور بياناتك. على سبيل المثال، يمكنك مقارنة توزيعات البيانات لكل Variety
وColor
في مخطط فئات.
-
أنشئ مثل هذا المخطط باستخدام وظيفة
catplot
، باستخدام بيانات القرعpumpkins
، وتحديد تعيين الألوان لكل فئة من فئات القرع (برتقالي أو أبيض):import seaborn as sns palette = { 'ORANGE': 'orange', 'WHITE': 'wheat', } sns.catplot( data=pumpkins, y="Variety", hue="Color", kind="count", palette=palette, )
من خلال ملاحظة البيانات، يمكنك رؤية كيف ترتبط بيانات اللون بالفئة.
✅ بالنظر إلى هذا المخطط الفئوي، ما هي بعض الاستكشافات المثيرة للاهتمام التي يمكنك تخيلها؟
معالجة البيانات: ترميز الميزات والتسميات
تحتوي مجموعة بيانات القرع الخاصة بنا على قيم نصية لجميع أعمدتها. العمل مع البيانات الفئوية يكون بديهيًا للبشر ولكنه ليس كذلك للآلات. تعمل خوارزميات تعلم الآلة بشكل جيد مع الأرقام. لهذا السبب، يعد الترميز خطوة مهمة جدًا في مرحلة معالجة البيانات، حيث يتيح لنا تحويل البيانات الفئوية إلى بيانات رقمية دون فقدان أي معلومات. يؤدي الترميز الجيد إلى بناء نموذج جيد.
لترميز الميزات، هناك نوعان رئيسيان من المشفرات:
-
المشفر الترتيبي: يناسب المتغيرات الترتيبية، وهي المتغيرات الفئوية التي تتبع بياناتها ترتيبًا منطقيًا، مثل عمود
Item Size
في مجموعة البيانات الخاصة بنا. يقوم بإنشاء تعيين بحيث يتم تمثيل كل فئة برقم، وهو ترتيب الفئة في العمود.from sklearn.preprocessing import OrdinalEncoder item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] ordinal_features = ['Item Size'] ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
-
المشفر الفئوي: يناسب المتغيرات الاسمية، وهي المتغيرات الفئوية التي لا تتبع بياناتها ترتيبًا منطقيًا، مثل جميع الميزات المختلفة عن
Item Size
في مجموعة البيانات الخاصة بنا. إنه ترميز ثنائي، مما يعني أن كل فئة يتم تمثيلها بعمود ثنائي: تكون المتغيرات المشفرة مساوية لـ 1 إذا كان القرع ينتمي إلى تلك الفئة و0 خلاف ذلك.from sklearn.preprocessing import OneHotEncoder categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] categorical_encoder = OneHotEncoder(sparse_output=False)
ثم يتم استخدام ColumnTransformer
لدمج عدة مشفرات في خطوة واحدة وتطبيقها على الأعمدة المناسبة.
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
من ناحية أخرى، لترميز التسمية، نستخدم فئة LabelEncoder
من scikit-learn، وهي فئة مساعدة لتطبيع التسميات بحيث تحتوي فقط على قيم بين 0 وn_classes-1 (هنا، 0 و1).
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
بمجرد أن نقوم بترميز الميزات والتسمية، يمكننا دمجها في إطار بيانات جديد encoded_pumpkins
.
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
✅ ما هي مزايا استخدام المشفر الترتيبي لعمود Item Size
؟
تحليل العلاقات بين المتغيرات
الآن بعد أن قمنا بمعالجة بياناتنا، يمكننا تحليل العلاقات بين الميزات والتسمية لفهم مدى قدرة النموذج على التنبؤ بالتسمية بناءً على الميزات. أفضل طريقة لإجراء هذا النوع من التحليل هي رسم البيانات. سنستخدم مرة أخرى وظيفة catplot
من Seaborn لتصور العلاقات بين Item Size
، Variety
وColor
في مخطط فئات. لتوضيح البيانات بشكل أفضل، سنستخدم عمود Item Size
المشفر وعمود Variety
غير المشفر.
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
استخدام مخطط السرب
نظرًا لأن Color
هو فئة ثنائية (أبيض أو ليس أبيض)، فإنه يحتاج إلى "نهج متخصص للتصور". هناك طرق أخرى لتصور العلاقة بين هذه الفئة والمتغيرات الأخرى.
يمكنك تصور المتغيرات جنبًا إلى جنب باستخدام مخططات Seaborn.
-
جرب مخطط "السرب" لإظهار توزيع القيم:
palette = { 0: 'orange', 1: 'wheat' } sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
تنبيه: قد ينتج الكود أعلاه تحذيرًا، حيث يفشل Seaborn في تمثيل هذا العدد الكبير من النقاط في مخطط السرب. الحل الممكن هو تقليل حجم العلامة باستخدام معامل 'size'. ومع ذلك، كن على علم بأن هذا يؤثر على قابلية قراءة المخطط.
🧮 أرني الرياضيات
يعتمد الانحدار اللوجستي على مفهوم "الاحتمالية القصوى" باستخدام دوال سيجمويد. تبدو دالة "سيجمويد" على الرسم البياني كمنحنى على شكل "S". تأخذ قيمة وتعينها إلى مكان ما بين 0 و1. يُطلق على منحناها أيضًا "منحنى لوجستي". تبدو صيغتها كالتالي:
حيث يكون منتصف السيجمويد عند النقطة 0 للمحور x، وL هو القيمة القصوى للمنحنى، وk هو انحدار المنحنى. إذا كانت نتيجة الدالة أكثر من 0.5، سيتم إعطاء التسمية المعنية الفئة "1" من الخيار الثنائي. إذا لم تكن كذلك، سيتم تصنيفها كـ "0".
بناء النموذج الخاص بك
بناء نموذج للعثور على هذا التصنيف الثنائي بسيط بشكل مدهش في Scikit-learn.
🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن بناء نموذج انحدار لوجستي
-
اختر المتغيرات التي تريد استخدامها في نموذج التصنيف الخاص بك وقسم مجموعات التدريب والاختبار باستخدام
train_test_split()
:from sklearn.model_selection import train_test_split X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] y = encoded_pumpkins['Color'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
الآن يمكنك تدريب النموذج الخاص بك، عن طريق استدعاء
fit()
باستخدام بيانات التدريب الخاصة بك، واطبع النتيجة:from sklearn.metrics import f1_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('F1-score: ', f1_score(y_test, predictions))
ألقِ نظرة على لوحة النتائج الخاصة بنموذجك. إنها ليست سيئة، بالنظر إلى أن لديك حوالي 1000 صف فقط من البيانات:
precision recall f1-score support 0 0.94 0.98 0.96 166 1 0.85 0.67 0.75 33 accuracy 0.92 199 macro avg 0.89 0.82 0.85 199 weighted avg 0.92 0.92 0.92 199 Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1] F1-score: 0.7457627118644068
فهم أفضل عبر مصفوفة الالتباس
بينما يمكنك الحصول على تقرير لوحة النتائج المصطلحات عن طريق طباعة العناصر أعلاه، قد تتمكن من فهم النموذج الخاص بك بسهولة أكبر باستخدام مصفوفة الالتباس لمساعدتنا على فهم كيفية أداء النموذج.
🎓 "مصفوفة الالتباس" (أو "مصفوفة الأخطاء") هي جدول يعبر عن الإيجابيات الحقيقية مقابل الإيجابيات الكاذبة والسلبيات الحقيقية مقابل السلبيات الكاذبة لنموذجك، وبالتالي قياس دقة التنبؤات.
-
لاستخدام مصفوفة الالتباس، استدعِ
confusion_matrix()
:from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions)
ألقِ نظرة على مصفوفة الالتباس الخاصة بنموذجك:
array([[162, 4], [ 11, 22]])
في Scikit-learn، تمثل الصفوف (المحور 0) التسميات الفعلية وتمثل الأعمدة (المحور 1) التسميات المتوقعة.
0 | 1 | |
---|---|---|
0 | TN | FP |
1 | FN | TP |
ما الذي يحدث هنا؟ لنفترض أن النموذج الخاص بنا طُلب منه تصنيف القرع بين فئتين ثنائيتين، الفئة "أبيض" والفئة "ليس أبيض".
- إذا توقع النموذج أن القرع ليس أبيضًا وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسمي ذلك سلبية حقيقية (True Negative)، وهو الرقم في الزاوية العلوية اليسرى.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسمي ذلك سلبية كاذبة (False Negative)، وهو الرقم في الزاوية السفلية اليسرى.
- إذا توقع النموذج أن القرع ليس أبيضًا وكان ينتمي بالفعل إلى الفئة "أبيض"، نسمي ذلك إيجابية كاذبة (False Positive)، وهو الرقم في الزاوية العلوية اليمنى.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "أبيض"، نسمي ذلك إيجابية حقيقية (True Positive)، وهو الرقم في الزاوية السفلية اليمنى.
كما قد تكون خمنت، من الأفضل أن يكون لديك عدد أكبر من الإيجابيات الحقيقية والسلبيات الحقيقية وعدد أقل من الإيجابيات الكاذبة والسلبيات الكاذبة، مما يعني أن النموذج يعمل بشكل أفضل. كيف ترتبط مصفوفة الالتباس بالدقة والاسترجاع؟ تذكر أن تقرير التصنيف الذي طُبع أعلاه أظهر دقة (0.85) واسترجاع (0.67).
الدقة = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
الاسترجاع = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ س: وفقًا لمصفوفة الالتباس، كيف كان أداء النموذج؟ ج: ليس سيئًا؛ هناك عدد جيد من القيم السلبية الحقيقية ولكن أيضًا بعض القيم السلبية الخاطئة.
دعونا نعيد النظر في المصطلحات التي رأيناها سابقًا بمساعدة خريطة TP/TN وFP/FN في مصفوفة الالتباس:
🎓 الدقة: TP/(TP + FP) النسبة المئوية للحالات ذات الصلة بين الحالات المسترجعة (على سبيل المثال، أي التصنيفات كانت مصنفة بشكل جيد).
🎓 الاسترجاع: TP/(TP + FN) النسبة المئوية للحالات ذات الصلة التي تم استرجاعها، سواء كانت مصنفة بشكل جيد أم لا.
🎓 درجة F1: (2 * الدقة * الاسترجاع)/(الدقة + الاسترجاع) متوسط مرجح للدقة والاسترجاع، حيث الأفضل هو 1 والأسوأ هو 0.
🎓 الدعم: عدد مرات ظهور كل تصنيف مسترجع.
🎓 الدقة الإجمالية: (TP + TN)/(TP + TN + FP + FN) النسبة المئوية للتصنيفات التي تم التنبؤ بها بدقة لعينة معينة.
🎓 المتوسط الكلي: حساب المتوسط غير الموزون للمقاييس لكل تصنيف، دون أخذ عدم التوازن في التصنيفات بعين الاعتبار.
🎓 المتوسط الموزون: حساب المتوسط الموزون للمقاييس لكل تصنيف، مع أخذ عدم التوازن في التصنيفات بعين الاعتبار من خلال وزنها بدعمها (عدد الحالات الحقيقية لكل تصنيف).
✅ هل يمكنك التفكير في أي مقياس يجب مراقبته إذا كنت تريد تقليل عدد القيم السلبية الخاطئة في النموذج؟
تصور منحنى ROC لهذا النموذج
🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن منحنيات ROC
دعونا نقوم بتصور آخر لرؤية ما يسمى بـ "منحنى ROC":
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
باستخدام مكتبة Matplotlib، قم برسم منحنى تشغيل المستقبل أو ROC للنموذج. تُستخدم منحنيات ROC غالبًا للحصول على رؤية لمخرجات المصنف من حيث القيم الإيجابية الحقيقية مقابل القيم الإيجابية الخاطئة. "عادةً ما تحتوي منحنيات ROC على معدل القيم الإيجابية الحقيقية على المحور Y، ومعدل القيم الإيجابية الخاطئة على المحور X." وبالتالي، فإن انحدار المنحنى والمساحة بين خط المنتصف والمنحنى مهمان: تريد منحنى يتجه بسرعة إلى الأعلى ويتجاوز الخط. في حالتنا، هناك قيم إيجابية خاطئة في البداية، ثم يتجه الخط إلى الأعلى ويتجاوز بشكل صحيح:
أخيرًا، استخدم واجهة برمجة التطبيقات roc_auc_score
الخاصة بـ Scikit-learn لحساب "المساحة تحت المنحنى" (AUC):
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
النتيجة هي 0.9749908725812341
. نظرًا لأن AUC يتراوح بين 0 و1، فإنك تريد الحصول على درجة كبيرة، حيث أن النموذج الذي يكون دقيقًا بنسبة 100% في توقعاته سيحصل على AUC بقيمة 1؛ في هذه الحالة، النموذج جيد جدًا.
في دروس التصنيف المستقبلية، ستتعلم كيفية تحسين درجات النموذج. ولكن في الوقت الحالي، تهانينا! لقد أكملت دروس الانحدار هذه!
🚀تحدي
هناك الكثير لاستكشافه فيما يتعلق بالانحدار اللوجستي! ولكن أفضل طريقة للتعلم هي التجربة. ابحث عن مجموعة بيانات تناسب هذا النوع من التحليل وقم ببناء نموذج باستخدامها. ماذا تتعلم؟ نصيحة: جرب Kaggle للحصول على مجموعات بيانات مثيرة للاهتمام.
اختبار ما بعد المحاضرة
المراجعة والدراسة الذاتية
اقرأ الصفحات الأولى من هذا البحث من جامعة ستانفورد حول بعض الاستخدامات العملية للانحدار اللوجستي. فكر في المهام التي تناسب نوعًا معينًا من مهام الانحدار التي درسناها حتى الآن. ما الذي سيكون الأنسب؟
الواجب
إخلاء المسؤولية:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.