القائمة الرئيسية

الصفحات

خوارزمية Logistic regression
عندما نَسمع بأسم هذه ألخوارزميةيتبادر ألى ذهننا أنها تُستخدم في مسائل الأنحدار Regression،ألا أن خوازرمية Logistic Regression تُستخدم في مسائل ألتصنيف Classification حيث يكون ألمُخرج output في ألنموذج على شكل أحتمالية Probability تُترجم فيما بعد ألى أحدى الفئات Classes.وتُستخدم هذه ألخوارزمية غالباً في ألمجالات ألطبية وألنمذجة الأحصائية في علم ألبيانات Data Science.


خوارزمية Logistic regression 

عندما نَسمع بأسم هذه ألخوارزميةيتبادر ألى ذهننا أنها تُستخدم في مسائل الأنحدار Regression،ألا أن خوازرمية Logistic Regression تُستخدم في مسائل ألتصنيف Classification حيث يكون ألمُخرج output في ألنموذج على شكل أحتمالية Probability تُترجم فيما بعد ألى أحدى الفئات Classes.وتُستخدم هذه ألخوارزمية غالباً في ألمجالات ألطبية وألنمذجة الأحصائية في علم ألبيانات Data Science.
والآن نأتي لنتعرف ماهي هذه الخوارزمية وكيف تعمل:


ماهي خوازرمية Logistic regression؟

وهي أحدى خوارزميات ألتصنيف Classification تُستخدم لتصنيف ألبيانات ألى فئات Classes منفصلة مثل 0/1،yes/No،Spam/NotSpam.الخ.
تقوم هذه ألخوارزمية بتحويل المُخرج output بأستخدام دالة Sigmoid (يمكنك الأطلاع على شرح Sigmoid Function من هنا) ألى قيم ألأحتمالية Probability ألتي سُتصنف ألى أحدى الفئات Classes ضمن هذه ألخوارزمية.
وللمقارنة بين خوارزمية Logistic Regression و خوارزمية Linear Regression(يمكنك الأطلاع على شرح خوارزمية Linear Regression من هنا) سنقوم بتوضيحها في الجدول الآتي:


Linear Regression
Logistic Regression

لو كانت لدينا بيانات لطالب وهذه البيانات هي عدد ساعات القراءة ودرجات الأمتحان،فيمكننا عن طريق هذه ألخوارزمية التنبؤ بدرجة الأمتحان ألتي يمكن أن يحصل عليها ألطالب أعتماداً على عدد ألساعات ألتي قضاها في الدراسة،وتكون هذه الدرجات ضمن المدى 0-100)).أي أن نتيجة التنبؤ تكون قيَم مستمرة values continuous.

لو كانت لدينا بيانات لطالب وهذه البيانات هي عدد ساعات القراءة ودرجات الأمتحان،فيمكننا عن طريق هذه ألخوارزمية التنبؤ هل ألطالب سينجح أم يفشل في الأمتحان أعتماداً على عدد ألساعات ألتي قضاها في الدراسة، أي يعني ألنتيجة ستكون ضمن Pass/Fail وتسمى هذه ألقيَم discrete values.


أنواع خوارزمية Logistic Regression:

1.   ثنائية Binary: يكون المُخرج للخوارزمية فئتين فقط مثل yes/no،Pass/Fail.
2.   متعددة Multi: يكون المُخرج للخوارزمية فئات متعددة مثل Car/Ship/Airplane.
3.    ترتيبية Ordinal: يكون المُخرج للخوارزمية فئات مرتبة بشكل معين مثل Long/Medium/Short.

لنأخذ خوارزمية Logistic Regression ذات النوع ألثنائي Binary كمثال ليتم شرح الخوارزمية بالتفصيل: نفرض أن لدينا بيانات لطالب وهي ساعات ألقراءة ونتيجة الأمتحان (كما ذكرناه هذا ألمثال في
جدول ألمقارنة أعلاه) وتكون كالتالي:

ساعات ألقراءة
(x)
نتيجة الأمتحان
(y)
0.30
0
0.45
0
1.00
0
1.30
0
1.45
0
2.00
1
2.30
1
3.00
1
3.30
1
3.45
1

لذلك،من خلال هذه ألبيانات سيكون لدينا:


تكون ألنتيجة 0 أذا فشل ألطالب في الأمتحان،وستكون 1 أذا أجتاز ألطالب الأمتحان.
ستكون معادلة ألنموذج للخوارزمية وألتي ستحدد لنا كيفية ألتنبؤ للبيانات ألمستقبلية بالشكل ألتالي:


حيث تمثل:
(h(xi: ألفرضية hypothesis ألتي تستند عليها ألخوارزمية.
B: معامل الأنحدار Regression Coefficient.
xi: ألبيانات ألتي لدينا.
 

لأننا نحتاج أن يكون مُخرج output ألخوارزمية على شكل أحتمالية،فهذا يعني يجب أن تكون ألقيم محصورة بين (0,1)،لذلك سنستعين بدالة Sigmoid (يمكنك الأطلاع على شرح Sigmoid Function من هنا) وألتي ستكون صيغتها ألرياضية بالشكل التالي:




والشيء ألمهم في هذه ألمرحلة هي أيجاد دالة الخطأ Error Function أو تسمى في بعض الأحيان Cost Function حيث نستخدم مع خوارزمية Logistic Regression نوع من دوال الخطأ تسمى أقصى تقدير للأحتمال maximum likelihood estimation (MLE) وألتي تكون صيغتها ألرياضية بالشكل ألتالي:



وهدفنا من أستخدام دالة الخطأ هو حساب مقدار ألخطأ ألذي ينتج عن ألتنبؤ ألخاطيء أثناء عملية ألتصنيف Classification،فكلما كان مقدار ألخطأ قليل أثناء عملية ألتدريب training كلما كانت عملية ألتصنيف لدينا جيدة،وحيث تمثل قيمة B معامل الأنحدار Regression Coefficient ألذي يمكن ألتحكم فيه لمحاولة تقليل مقدار ألخطأ لدينا.
لأيجاد أفضل قيمة B ألتي تجعل مقدار ألخطأ لدينا أقل مايمكن لكي تتم عملية التنبؤ بصورة دقيقة وجيدة،يجب علينا أستخدام أحدى خوارزميات ألتحسين Optimization Algorithms وهناك أنواع عديدة من هذه ألخوارزميات وأشهر خوارزمية للتحسين ألتي تتعامل مع خوارزمية Logistic Regression هي خوارزمية ألنزول ألتدريجي Gradient descent algorithm ألتي نقوم من خلالها بلأشتقاق ألجزئي لدالة ألخطأ أعلاه بالنسبة لبراميتر B.
وتكون ألصيغة ألرياضية لخوارزمية ألنزول ألتدريجي بالشكل ألتالي:


حيث تمثل a معدل التعليم learning rate وهذه ألقيمة نحن من يقوم بأختيارها في ألخوارزمية فهي بصورة عامة تمثل سرعة التدرج في خوارزمية التحسين فأذا كانت مقدارها كبير ستكون سرعة ألتدريب عالية لكن هذا سيكون مؤثر على كفاءة ألتدريب والعكس بالعكس،لذلك يجب أختيار قيمتها بصورة معقولة.
والآن لنأخذ مثال عملي تم أنشاءه بلغة بايثون ألرائعة(أذا أردت تعلم لغة بايثون فعليك بسلسلة مقالات (تعلمبايثون)).
سنطبق خوارزميتنا على بيانات Iris flower dataset (يمكنك تحميلها من هنا) ألتي تتكون من 3 فئات Classes وهي( Setosa, Versicolour, Virginica) وسنطبق خوارزميتنا للتنبؤ بالبيانات المستقبلية ألمدخلة أليها.


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
data = pd.read_csv('iris-data.csv')

نقوم بأستدعاء المكتبات ألمطلوبةومن ثم نقوم بأستدعاء بيانات iris-data وحفظها في متغير data بمساعدة مكتبة pandas ألتي تمكننا من قراءة هذه البيانات.

print(data.head())

ولرؤية وأستكشاف ماتحتويه هذه ألبيانات،فيمكننا عن طريق الأيعاز أعلاه تنفيذ ذلك وستظهر لدينا ألبيانات بالشكل التالي:


(sns.pairplot(data, hue='class', size=2.5
()plt.show

يمكننا أستكشاف هذه ألبيانات بصورة أحصائية من خلال ألرسم ألبياني،وهنا يأتي دور ألمكتبة ألمذهلة seaborn لتوفر لنا هذه الأمكانية ألرائعة ومن خلال ألكود ألموضح أعلاه يمكننا أظهار ألنتيجة التالية:

final_data = data[data['class'] != 'Iris-versicolor']

سنقوم بأستعمال نوع ألخوازرمية ألثنائي Binary Logistic Regression أي يعني ستحتوي ألخوارزمية على فئتين فقط،ولأن بيانات Iris flower dataset تحتوي على 3 فئات،سنقوم بحذف أحدى ألفئات الثلاث وأنا أخترت أن نحذف فئة versicolor وذلك من خلال الأيعاز أعلاه.
سنقوم بأظهار ألبيانات بشكل أحصائي،ولكن هذه ألمرة ستظهر لدينا فئتان فقط:


sns.pairplot(final_data, hue='class', size=2.5)
            final_data['class'].replace(["Iris-setosa","Iris-virginica"], [1,0], inplace=True)
من الملاحظ أن أسماء ألفئات لدينا هي Iris-setosa و Iris-virginica وهي بيانات عبارة عن حروف،لذلك يجب ترجمة أسماء هذه ألفئات ألى أرقام 01,لكي تتم عملية ألتدريب training بصورة صحيحة،ويمكننا ذلك من خلال الأيعاز أعلاه.وأذا عدنا لرؤية وأستكشاف هذه ألبيانات فسنجد في عمود class كيف تحولت الفئات ألى أرقام 1,0.

(inp_X = final_data.drop(final_data.columns[[4]], axis=1
(out_y = final_data.drop(final_data.columns[[0,1,2,3]], axis=1
()scaler_x = StandardScaler
(inp_df = scaler_x.fit_transform(inp_X
(X_train, X_test, y_train, y_test = train_test_split(inp_df, out_y, test_size=0.2, random_state=42

والآن نأتي ألى فقرة تقسيم ألبيانات ألى بيانات تدريب training data وبيانات أختبار testing data،في السطرين الأول والثاني من ألكود أعلاه سنقوم بتحديد بيانات ألتدريب وخزنها في متغير inp_x والليبل ألخاص بها في متغير out_y. بعد ذلك نقوم بعمل normalization لبيانات ألتدريب لتحويل جميع ألقيم بين (1,0) لسهولة التعامل معها من خلال أستخدام الدالة ()StandardScaler وتتم هذه ألعملية في ألسطرين ألثاني والثالث،ثم في ألسطر الأخير سنجري عملية تقسيم ألبيانات.

X_train_mx = X_train
X_test_mx = X_test
y_train_mx = y_train.as_matrix()
y_test_mx = y_test.as_matrix()
from sklearn.linear_model import LogisticRegression
()classifier = LogisticRegression
(classifier.fit(X_train_mx, y_train_mx
(pred = classifier.predict(X_test_mx
(print ('Accuracy: {0}'.format(classifier.score(X_test_mx, y_test

في ألجزء الأخير من الكود سنقوم بعملية ألتدريب وسنقوم بأستدعاء نموذج خوارزمية Logistic Regression من خلال المكتبة ألرائعة sklearn ألتي توفر لنا هذا ألنموذج ألجاهز لسهولة أستخدامه،وعند تنفيذ ألكود ستقوم ألخوارزمية بعملية ألتدريب وسنقوم بأظهار مقدار ألدقة Accuracyألتي حصلنا عليها وألتي ستكون 100%.


Accuracy: 1.0

ألى هنا وصلنا وصلنا ألى نهاية ألمقال وأتمنى أن ينال حسن أصغائكم وأستيعابكم لمفهوم هذه ألخوارزمية ألرائعة،وأي أستفسار أو سؤال فيمكنكم تركه لي في خانة التعليقات في الأسفل.
شكراً لكم


م.م رسول حسن


هل اعجبك الموضوع :

تعليقات