تمرين - بناء نموذج للتعلم الآلي
لإنشاء نموذج للتعلم الآلي، تحتاج إلى مجموعتي بيانات: واحدة للتدريب، والأخرى للاختبار. في الممارسة العملية، غالبًا ما يكون لديك مجموعة بيانات واحدة فقط؛ لذلك تقوم بتقسيمها إلى قسمين. في هذا التمرين، ستقوم بإجراء من 80-20 تقسيم على الـ DataFrame الذي أعددته في المعمل السابق حتى تتمكن من استخدامه لتدريب نموذج للتعلم الآلي. ستقوم أيضًا بفصل DataFrame إلى أعمدة الميزة وأعمدة التسمية. يحتوي الأول على الأعمدة المستخدمة كمدخلات للنموذج (على سبيل المثال: منشأ الرحلة ووجهتها، ووقت المغادرة المقرر)، بينما يحتوي الثاني على العمود الذي سيحاول النموذج التوقع به - في هذه الحالة، عمود ARR_DEL15، الذي يشير إلى ما إذا كانت الرحلة ستصل في الوقت المحدد أم لا.
التحول مرة أخرى إلى Azure notebook الذي قمت بإنشائه في المقطع السابق. إذا قمت بإغلاق دفتر الملاحظات، يمكنك تسجيل الدخول مرة أخرى إلى مدخل Microsoft Azure Notebooks، افتح دفتر ملاحظاتك، واستخدم Cell ->Run All لإعادة تشغيل جميع الخلايا في دفتر الملاحظات بعد فتحه.
في خلية جديدة في نهاية دفتر الملاحظات، أدخل العبارات التالية ونفذها:
from sklearn.model_selection import train_test_split train_x, test_x, train_y, test_y = train_test_split(df.drop('ARR_DEL15', axis=1), df['ARR_DEL15'], test_size=0.2, random_state=42)تستورد العبارة الأولى وظيفة المساعد train_test_split scikit-learn. يستخدم السطر الثاني الدالة لتقسيم DataFrame إلى مجموعة تدريب تحتوي على 80٪ من البيانات الأصلية، ومجموعة اختبار تحتوي على الـ 20٪ المتبقية. تزرع
random_stateالمعلمة منشئ الأرقام العشوائية المستخدم لإجراء التقسيم، بينما المعلمات الأولى والثانية هي DataFrames التي تحتوي على أعمدة الميزة وعمود التسمية.train_test_splitإرجاع أربعة DataFrames. استخدم الأمر التالي لعرض عدد الصفوف والأعمدة في DataFrame التي تحتوي على أعمدة الميزة المستخدمة للتدريب:train_x.shapeالآن استخدم هذا الأمر لعرض عدد الصفوف والأعمدة في DataFrame التي تحتوي على أعمدة الميزة المستخدمة للاختبار:
test_x.shapeكيف تختلف المخرجات في كل منهما، ولماذا؟
هل يمكنك التنبؤ بما قد تراه إذا قمت باستدعاء shape اثنين من DataFrames الآخرين، train_y و test_y؟ إذا لم تكن متأكدًا، جربه واعرف.
هناك العديد من أنواع نماذج التعلم الآلي. أكثرها شيوعًا هو نموذج الانحدار، الذي يستخدم أحد خوارزميات الانحدار لإنتاج قيمة رقمية — على سبيل المثال، عمر الشخص، أو احتمال أن تكون معاملات بطاقة الائتمان احتيالية. ستقوم بتدريب نموذج تصنيف، والذي يسعى إلى حل مجموعة من المدخلات في واحدة من مجموعات المخرجات المعروفة. ومن الأمثلة الكلاسيكية لنموذج التصنيف نموذج يفحص رسائل البريد الإلكتروني ويصنفها على أنها "غير مرغوب فيها" أو ليست "غير مرغوب فيها". سيكون النموذج الخاص بك نموذج تصنيف ثنائي يتنبأ ما إذا كانت الرحلة ستصل في الوقت المحدد أم متأخرة ("ثنائي" بسبب وجود نتيجتين محتملين فقط).
واحدة من فوائد استخدام scikit-learn هو أنك لست مضطر أن تبني هذه النماذج -- أو تنفيذ الخوارزميات التي يستخدمونها -- باليد. يتضمن Scikit-learn مجموعة متنوعة من التصنيفات لتنفيذ نماذج التعلم الآلي الشائعة. واحد منهم هو RandomForestClassifier، الذي يناسب أشجار قرارات متعددة للبيانات ويستخدم متوسط لتعزيز الدقة الإجمالية والحد من الملاءمة الزائدة.
نفذ التعليمة البرمجية التالية في خلية جديدة لإنشاء عنصر
RandomForestClassifierوتدريبه عن طريق استدعاء الأسلوب fit.from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state=13) model.fit(train_x, train_y)يظهر الإخراج المعلمات المستخدمة في المصنف، بما في ذلك
n_estimators، الذي يحدد عدد الأشجار في كل غابة شجرة قرار، وmax_depth، والذي يحدد الحد الأقصى لعمق أشجار القرار. القيم المعروضة هي القيم الافتراضية، ولكن يمكنك تجاوز أي منها عند إنشاءRandomForestClassifierالكائن.
تدريب النموذج
الآن قم باستدعاء الأسلوب predict لاختبار النموذج باستخدام القيم الموجودة في
test_x، متبوعاً بأسلوب score لتحديد متوسط دقة النموذج:predicted = model.predict(test_x) model.score(test_x, test_y)تأكد من أنك تشاهد المخرجات التالية:
اختبار النموذج
متوسط الدقة هو 86٪، الذي يبدو جيدًا على السطح. ومع ذلك، فإن متوسط الدقة ليس دائمًا مؤشرًا موثوقًا لدقة نموذج التصنيف. دعونا نتعمق قليلاً، ونحدد مدى دقة النموذج حقًا - بمعنى أن، كيف هو بارع في تحديد ما إذا كانت ستصل الرحلة في الوقت المحدد.
هناك عدة طرق لقياس دقة نموذج التصنيف. أحد أفضل المقاييس الإجمالية لنموذج التصنيف الثنائي هو المنطقة تحت منحنى خاصية تشغيل المتلقي (يشار إليها أحيانا باسم "ROC AUC")، والتي تحدد بشكل أساسي عدد المرات التي سيقوم فيها النموذج بتوقع صحيح بغض النظر عن النتيجة. في هذه الوحدة، ستحسب درجة ROC AUC للنموذج الذي أنشأته سابقا وتتعرف على بعض الأسباب التي تجعل هذه النتيجة أقل من متوسط إخراج الدقة بواسطة score الأسلوب. ستتعرف أيضًا على طرق أخرى لقياس دقة النموذج.
قبل حساب ROC AUC، يجب إنشاء احتمالات التنبؤ لمجموعة الاختبار. هذه الاحتمالات هي تقديرات لأي من التصنيفات، أو الإجابات، التي يمكن للنموذج توقعها. على سبيل المثال،
[0.88199435, 0.11800565]يعني أن هناك فرصة بنسبة 89٪ أن تصل الرحلة في الوقت المحدد (ARR_DEL15 = 0) وفرصة بنسبة 12٪ أنها لن تصل (ARR_DEL15 = 1). مجموع الاحتمالين يصل إلى 100٪.شَغّل التعليمة البرمجية التالية لإنشاء مجموعة من احتمالات التوقع من بيانات الاختبار:
from sklearn.metrics import roc_auc_score probabilities = model.predict_proba(test_x)الآن استخدم العبارة التالية لإنشاء درجة ROC AUC من الاحتمالات باستخدام أسلوب roc_auc_score scikit-learn:
roc_auc_score(test_y, probabilities[:, 1])تأكد من أن المخرجات تُظهر درجة 67٪:
إنشاء درجة AUC
لماذا درجة AUC أقل من متوسط الدقة المحسوبة في التمرين السابق؟
يعكس الإخراج من
scoreالأسلوب عدد العناصر في مجموعة الاختبار التي تم التنبؤ بها بشكل صحيح. هذه النتيجة منحرفة من حقيقة أن مجموعة البيانات التي تم تدريب النموذج واختباره بها، تحتوي على عدد أكبر من الصفوف التي تمثل الوصول في الوقت المحدد عن الصفوف التي تمثل الوصول المتأخر. وبسبب هذا الخلل في البيانات، من المرجح أن تكون صحيحًا إذا توقعت أن الرحلة ستكون في الوقت المحدد أكثر مما لو توقعت أن الرحلة ستكون متأخرة.تأخذ ROC AUC هذا في الاعتبار وتوفر مؤشرا أكثر دقة على مدى احتمالية أن يكون التنبؤ في الوقت المحدد أو المتأخر صحيحا.
يمكنك معرفة المزيد حول سلوك النموذج عن طريق إنشاء مصفوفة الارتباك، والمعروفة أيضا باسم مصفوفة الخطأ. تحدد مصفوفة الارتباك عدد المرات التي تم فيها تصنيف كل إجابة بشكل صحيح أو غير صحيح. على وجه التحديد، فإنه يحدد عدد الإيجابيات الخاطئة، والسلبيات الخاطئة، والإيجابيات الحقيقية، والسلبيات الحقيقية. هذا مهم؛ لأنه إذا تم اختبار نموذج التصنيف الثنائي، المدرب على التعرف على القطط والكلاب، مع مجموعة بيانات 95٪ كلاب، فإنه يمكن أن يسجل 95٪ ببساطة عن طريق تخمين "كلب" في كل مرة. ولكن إذا فشل في التعرف على القطط على الإطلاق، فإنه سيكون من قيمة ضئيلة.
استخدم التعليمة البرمجية التالية لإنتاج مصفوفة الارتباك للنموذج الخاص بك:
from sklearn.metrics import confusion_matrix confusion_matrix(test_y, predicted)يمثل الصف الأول في المخرجات، الرحلات التي كانت في الوقت المحدد. يظهر العمود الأول في هذا الصف عدد الرحلات التي تم توقعها بشكل صحيح لتكون في الوقت المحدد، في حين يكشف العمود الثاني عن عدد الرحلات التي تم توقعها على أنها متأخرة، ولكنها لم تكن كذلك. من هذا، يبدو أن النموذج بارع في التوقع بأن الرحلة ستكون في الوقت المحدد.
إنشاء مصفوفة ارتباك
ولكن انظر إلى الصف الثاني، الذي يمثل الرحلات الجوية التي تأخرت. يظهر العمود الأول عدد الرحلات المتأخرة التي تم توقعها بشكل غير صحيح لتكون في الوقت المحدد. ويبين العمود الثاني عدد الرحلات الجوية التي تم توقعها بشكل صحيح لتكون متأخرة. ومن الواضح أن النموذج ليس بارعًا تقريبًا في التوقع بأن الرحلة ستتأخر كما هو الحال في التوقع بأن الرحلة ستصل في الوقت المحدد. ما تريده في مصفوفة الإرباك هو أعداد كبيرة في الزاويتين العلوية اليمنى والسفلية اليمنى، والأرقام الصغيرة (يفضل الأصفار) في الزاويتين العلوية اليمنى والسفلية اليمنى.
وتشمل مقاييس الدقة الأخرى لنموذج التصنيف الدقة والاسترجاع. افترض أن النموذج تم تقديمه مع ثلاثة رحلات وصول في الوقت المحدد، وثلاثة رحلات وصول متأخرة، وأنه بشكل صحيح توقع اثنين من الرحلات في الوقت المحدد؛ ولكن بشكل غير صحيح توقع أن اثنين من الرحلات المتأخرة سيكونان في الوقت المحدد. في هذه الحالة، ستكون الدقة 50 ٪ (اثنتان من الرحلات الأربع التي صنفها على أنها في الوقت المحدد كانت في الواقع في الوقت المحدد)، في حين أن استرجاعها سيكون 67 ٪ (حدد بشكل صحيح اثنين من الرحلات الثلاث في الوقت المحدد). يمكنك معرفة المزيد حول الدقة والاستدعاء من https://en.wikipedia.org/wiki/Precision_and_recall
يحتوي Scikit-learn على أسلوب مفيد يسمى precision_score لدقة الحوسبة. لتحديد دقة النموذج الخاص بك، نفذ العبارات التالية:
from sklearn.metrics import precision_score train_predictions = model.predict(train_x) precision_score(train_y, train_predictions)افحص المخرجات. ما هي دقة نموذجك؟
قياس الدقة
يحتوي Scikit-learn أيضا على أسلوب يسمى recall_score لاسترجاع الحوسبة. لقياس استرجاع النموذج، قم بتنفيذ العبارات التالية:
from sklearn.metrics import recall_score recall_score(train_y, train_predictions)ما هو استرجاع النموذج؟
قياس الاستدعاء
استخدم الأمر File ->Save and Checkpoint لحفظ دفتر الملاحظات.
في العالم الحقيقي، يبحث عالم البيانات المدرب عن طرق لجعل النموذج أكثر دقة. من بين أمور أخرى، سيحاولون خوارزميات مختلفة ويتخذون خطوات لضبط الخوارزمية المختارة للعثور على المجموعة المثلى من المعلمات. ومن الخطوات الأخرى المرجحة، العمل على توسيع نطاق مجموعة البيانات إلى ملايين الصفوف بدلاً من بضعة آلاف، ومحاولة أيضًا الحد من عدم التوازن بين رحلات الوصول المتأخرة والقادمة في الوقت المحدد. ولكن لأغراضنا، النموذج على ما يرام كما هو.