أشجار القرار في بايثون مع Scikit-Learn

أشجار القرار في بايثون

شجرة القرار هي واحدة من خوارزميات التعلم الآلي بلإشراف الأكثر استخدامًا والتي يمكنها أداء مهام الانحدار والتصنيف. الحدس الكامن وراء خوارزمية شجرة القرار بسيط ولكنه قوي أيضًا. لكل خصیصه في مجموعة البيانات، تشكل خوارزمية شجرة القرار عقدة، حيث يتم وضع الخصیصه الأكثر أهمية في العقدة الجذرية.

للتقييم، نبدأ من العقدة الجذرية ونعمل في طريقنا إلى أسفل الشجرة باتباع العقدة المقابلة التي تلبي حالتنا أو “القرار”. تستمر هذه العملية حتى يتم الوصول إلى العقدة الطرفية، والتي تحتوي على التنبؤ أو نتيجة شجرة القرار.

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

  1. هل هذا الشخص صديق مقرب أم مجرد أحد معارفه؟ إذا كان الشخص مجرد أحد معارفه، فقم برفض الطلب؛ إذا كان الشخص صديقًا، فانتقل إلى الخطوة التالية.
  2. هل يسأل الشخص عن السيارة لأول مرة؟ إذا كان الأمر كذلك، فاقرضهم السيارة، وإلا فانتقل إلى الخطوة التالية.
  3. هل تضررت السيارة آخر مرة أعادوا السيارة؟ إذا كانت الإجابة بنعم، ارفض الطلب؛ إذا كانت الإجابة “لا”، فأعارهم السيارة.

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

أشجار القرار في بايثون

مزايا أشجار القرار

هناك العديد من المزايا لاستخدام أشجار القرار للتحليل التنبئي:

  1. يمكن استخدام أشجار القرار للتنبؤ بكل من المقادیر المستمرة والمنفصلة، أي أنها تعمل بشكل جيد لكل من مسائل الانحدار والتصنيف.
  2. إنها تتطلب جهدًا أقل نسبيًا لتدريب الخوارزمية.
  3. يمكن استخدامها لتصنيف البيانات غير القابلة للفصل خطيًا.
  4. إنها سريعة وفعالة جدًا مقارنةً بـ KNN وخوارزميات التصنيف الأخرى.

تنفيذ أشجار القرار باستخدام Scikit-Learn

في هذا القسم، سنقوم بتنفيذ خوارزمية شجرة القرار باستخدام مكتبة Scikit-Learn فی بایثون. في الأمثلة التالية سنحل مسائل التصنيف وكذلك الانحدار باستخدام شجرة القرار.

ملاحظة: تم تنفيذ مهام التصنيف والانحدار في جوبیتر نوتبوک آی­بایثون (Jupyter iPython Notebook).

1. شجرة القرار للتصنيف

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

مجموعة البيانات

يمكن تنزيل مجموعة البيانات الخاصة بهذه المهمة من هنا.

لمزيد من المعلومات التفصيلية حول مجموعة البيانات هذه، تحقق من UCI ML repo لمجموعة البيانات هذه. باقي خطوات تنفيذ هذه الخوارزمية في Scikit-Learn متطابقة مع أي مشكلة نموذجية للتعلم الآلي، سنقوم باستيراد مكتبات ومجموعات بيانات، وإجراء بعض تحليل البيانات، وتقسيم البيانات إلى مجموعات تدريب واختبار، وتدريب الخوارزمية، وإجراء تنبؤات، وأخيرًا سنقيم بتقییم الخوارزمية في مجموعة البيانات الخاصة بنا.

استيراد المكتبات

يستورد البرنامج النصي التالي المكتبات المطلوبة:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

استيراد مجموعة البيانات

نظرًا لأن ملفنا بتنسيق CSV، فسنستخدم طريقة read_csv مکتبه الباندا (pandas) لقراءة ملف بيانات CSV الخاص بنا. قم بتنفيذ البرنامج النصي التالي للقيام بذلك:

dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")

في هذه الحالة، يوجد الملف “bill_authentication.csv” في مجلد “Datasets” لدرایف “D”. يجب عليك تغيير هذا المسار وفقًا لإعداد النظام الخاص بك.

تحليل البيانات

نفّذ الأمر التالي لمعرفة عدد الصفوف والأعمدة في مجموعة البيانات الخاصة بنا:

dataset.shape

سيظهر الناتج “(1372،5)”، مما يعني أن مجموعة البيانات لدينا بها 1372 سجلًا و 5 خصائص.

نفّذ الأمر التالي لفحص السجلات الخمسة الأولى لمجموعة البيانات:

dataset.head()

سيبدو الإخراج كما يلي:

أشجار القرار في بايثون

تجهيز البيانات

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

لتقسيم البيانات إلى لصائق وخصائص، قم بتنفيذ الكود التالي:

X = dataset.drop('Class', axis=1)
y = dataset['Class']

هنا يحتوي المتغير X على جميع الأعمدة من مجموعة البيانات، باستثناء عمود “Class”، وهو الصیقه. يحتوي المتغير y على المقادیر من عمود “Class”. المتغير X هو مجموعة الخصائص الخاصة بنا والمتغير y يحتوي على الصائق مقابلة.

الخطوة النهائية للمعالجة المسبقة هي تقسيم بياناتنا إلى مجموعات تدريب واختبار. تحتوي مكتبة model_selection في Scikit-Learn على طريقة train_test_split، والتي سنستخدمها لتقسيم البيانات عشوائيًا إلى مجموعات تدريب واختبار. قم بتنفيذ التعليمات البرمجية التالية للقيام بذلك:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)

في الكود أعلاه، تحدد بارامتر test_size نسبة مجموعة الاختبار، والتي نستخدمها لتقسيم 20 بلمئه من البيانات إلى مجموعة الاختبار و 80 بلمئه للتدريب.

التدريب وعمل التنبؤات

بمجرد تقسيم البيانات إلى مجموعات التدريب والاختبار، فإن الخطوة الأخيرة هي تدريب خوارزمية شجرة القرار على هذه البيانات وإجراء التنبؤات. يحتوي Scikit-Learn على مكتبة tree، والتي تحتوي على فئات/طرق مضمنة لمختلف خوارزميات شجرة القرار. نظرًا لأننا سنقوم بتنفيذ مهمة تصنيف هنا، فسنستخدم فئة DecisionTreeClassifier لهذا المثال. يتم استدعاء طريقة fit لهذا الفئه لتدريب الخوارزمية على بيانات التدريب، والتي يتم تمريرها كبارامتر لطريقة fit. نفِّذ النص التالي لتدريب الخوارزمية:

from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()
classifier.fit(X_train, y_train)

الآن وقد تم تدريب المصنف الخاص بنا، فلنقم بالتنبؤات بشأن بيانات الاختبار. لعمل تنبؤات، يتم استخدام طريقة predict لفئة DecisionTreeClassifier. ألق نظرة على الكود التالي للاستخدام:

تقييم الخوارزمية

في هذه المرحلة، قمنا بتدريب خوارزميتنا وقمنا ببعض التنبؤات. الآن سنرى مدى دقة خوارزمية لدينا. بالنسبة لمهام التصنيف، فإن بعض المقاييس الشائعة الاستخدام هي مصفوفة الارتباك (confusion matrix) والدقة (accuracy) والاستدعاء (recall) ودرجة F1 (F1 score). من حسن حظنا أن مكتبة مقاييس Scikit-Learn تحتوي على طريقتين category_report و confusion_matrix التي يمكن استخدامها لحساب هذه المقاييس بالنسبة لنا:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

سينتج عن ذلك التقييم التالي:

[[142    2]
    2  129]]
              precision   recall   f1-score   support

           0       0.99     0.99       0.99       144
           1       0.98     0.98       0.98       131

 avg / total       0.99     0.99       0.99       275

من مصفوفة الارتباك، يمكنك أن ترى أنه من بين 275 حالة اختبار، فإن الخوارزمية الخاصة بنا قد أخطأت في تصنيف 4 فقط. هذه دقة 98.5 بلمئه. ليس سيئا جدا!

2. شجرة القرار للانحدار

تشبه عملية حل مشكلة الانحدار باستخدام شجرة القرار باستخدام Scikit-Learn عملية التصنيف. ومع ذلك، بالنسبة للانحدار، نستخدم فئة DecisionTreeRegressor لمكتبة الشجرة. كما تختلف مقاييس تقييم الانحدار عن تلك الخاصة بالتصنيف. ما تبقى من العملية هو نفسه تقريبا.

مجموعة البيانات

مجموعة البيانات التی سنستخدمهما یمکن تنزیلها من هنا.

سنستخدم مجموعة البيانات هذه لمحاولة التنبؤ باستهلاك الغاز (بملايين الجالونات) في 48 ولاية أمريكية بناءً على ضريبة الغاز (بالسنت)، ودخل الفرد (بالدولار)، والطرق السريعة المعبدة (بالأميال) ونسبة السكان مع رخصة السائق.

يمكن العثور على تفاصيل مجموعة البيانات من المصدر الأصلي.

لا يوفر أول عمودين في مجموعة البيانات أعلاه أي معلومات مفيدة، لذلك تمت إزالتهما من ملف مجموعة البيانات.

الآن دعنا نطبق خوارزمية شجرة القرار الخاصة بنا على هذه البيانات لمحاولة التنبؤ باستهلاك الغاز من هذه البيانات.

استيراد المكتبات

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

استيراد مجموعة البيانات

dataset = pd.read_csv('D:\Datasets\petrol_consumption.csv')

تحليل البيانات

سنستخدم مرة أخرى اداله head لإطار البيانات لنرى كيف تبدو بياناتنا في الواقع:

dataset.head()

يبدو الإخراج كالتالي:

أشجار القرار في بايثون

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

dataset.describe()

سیکون الاخراج کما یلی:

أشجار القرار في بايثون

تجهيز البيانات

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

X = dataset.drop('Petrol_Consumption', axis=1)
y = dataset['Petrol_Consumption']

هنا يحتوي المتغير X على جميع الأعمدة من مجموعة البيانات، باستثناء عمود “Petrol_Consumption”، وهو الصیقه. يحتوي المتغير y على قيم من عمود “Petrol_Consumption”، مما يعني أن متغير X يحتوي على مجموعة الخصائص ومتغير y يحتوي على الصائق المقابلة.

قم بتنفيذ الكود التالي لتقسيم بياناتنا إلى مجموعات تدريب واختبار:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

التدريب وعمل التنبؤات

كما ذكرنا سابقًا، بالنسبة لمهمة الانحدار، سنستخدم فئة sklearn مختلفة عما فعلناه لمهمة التصنيف. الفئه الذي سنستخدمه هنا هو فئة DecisionTreeRegressor، على عكس DecisionTreeClassifier من قبل. لتدريب الشجرة، سننشئ فئة DecisionTreeRegressor وندعو التابع fit:

from sklearn.tree import DecisionTreeRegressor
regressor = DecisionTreeRegressor()
regressor.fit(X_train, y_train)

لعمل تنبؤات على مجموعة الاختبار، استخدم طريقة predict:

y_pred = regressor.predict(X_test)

الآن دعنا نقارن بعض مقادیرنا المتوقعة بلمقادیر الفعلية ونرى مدى دقتها:

df=pd.DataFrame({'Actual':y_test, 'Predicted':y_pred})
df

تذكر أنه في حالتك، قد تكون السجلات التي تمت مقارنتها مختلفة، اعتمادًا على تقسيم التدريب والاختبار. نظرًا لأن طريقة train_test_split تقسم البيانات بشكل عشوائي، فمن المحتمل ألا يكون لدينا نفس مجموعات التدريب والاختبار.

تقييم الخوارزمية

لتقييم أداء خوارزمية الانحدار، فإن المقاييس المستخدمة بشكل شائع تعني متوسط الخطأ المطلق (mean absolute error) ومتوسط الخطأ التربيعي (mean squared error) ومتوسط الجذر الخطأ التربيعي (root mean squared error).

تحتوي مكتبة Scikit-Learn على وظائف يمكن أن تساعدنا في حساب هذه القيم. للقيام بذلك، استخدم هذا الرمز من حزمة المقاييس:

from sklearn import metrics
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

جب أن يبدو الإخراج مثل هذا:

Mean Absolute Error: 54.7
Mean Squared Error: 4228.9
Root Mean Squared Error: 65.0299930801

متوسط الخطأ المطلق لخوارزمية لدينا هو 54.7، وهو أقل من 10 في المائة من متوسط جميع القيم في عمود ” Petrol_Consumption”. هذا يعني أن الخوارزمية الخاصة بنا قامت بعمل تنبؤ جيد.

المصادر:

المصدر الاول

منشور ذات صلة
8 Minutes

الانحدار الخطي

حسن خنفري

تعتبر نماذج الانحدار الخطي نقطة انطلاق جيدة لمهام الانحدار. تحظى مثل هذه النماذج بشعبية لأنها […]

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة