الانحدار الخطي (بايثون)

ترجمة: محمد كامل

يعتبر الانحدار الخطي أحد أشهر نماذج تعلم الآلة التي تستخدم في التحليلات التنبؤية من خلال دراسة العلاقة بين المتغير (التابع) والمتغير (المستقل). 

سنتعلم في هذا الدرس عدة نقاط:

1- كيفية بناء نموذج الانحدار الخطي بلغة بايثون. 

2- تقييم النموذج من خلال تقييم دقة التنبؤ و قيمة R-squared.

3- كيفية التحقق من النموذج عن طريق اختبار الخطية linearity ، والحالة الطبيعية normality ، والتجانس homoscedasticity ، والارتباط الذاتي autocorrelation ، والخطية المتعددة multicollinearity. 

4- طريقة الكشف عن القيم المتطرفة عن طريق اختبار مسافة كوك Cook’s distance.

هناك عدة أنواع للانحدار الخطي. الانحدار الخطي البسيط: عندما يكون هناك متغير مسقل واحد. و الانحدار الخطي المتعدد: عندما يكون هناك أكثر من متغير مستقل. وبشكل عام، فإن البيانات لا تكون بشكل خطي في أغلب الحالات الطبيعية، لذلك تحتوي معادة الانحدار الخطي على معدل الخطأ error term

نموذج الانحدار الخطي

سنقوم ببناء نموذج انحدار خطي متعدد نحلل فيه بيانات الإسكان في مدينة بوسطن في الولايات المتحدة في نهاية السبعينيات 1790s. تحتوي البيانات على 506 حالة (Cases) و 14 متغير (attributes).

دعونا نأخذ نظرة سريعة على البيانات:

names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'[

(data = pd.read_csv("./housing.csv", delim_whitespace=True, names=names

()data.head

1- نبذة عن المتغيرات الواردة في البيانات:

Crime: معدل الجريمة.

ZN: نسبة الأراضي السكنية.

INDUS: نسبة المساحة المخصصة للأعمال التجارية لغير قطاع التجزئة.

CHAS: هل المنطقة السكنية محاذية لنهر تشارليس (1 إذا كانت محاذية و 0 إذا كانت عكس ذلك).

NOX: معدل تركيز النيتروجين في المنطقة.

RM: متوسط عدد الغرف في المساكن.

AGE: نسبة السكان المالكين للمساكن التي بنيت قبل عام 1940.

DIS: المسافة بين المنطقة و أقرب 5 مراكز توظيف.

RAD: مؤشر سهولة الوصول إلى الطرق السريعة.

TAX: معدل قيمة ضريبة المساكن لكل 10000 دولار.

PTRATIO: عدد التلاميذ إلى المعلمين.

B: نسبة السكان من البشرة السوداء.

LSTAT: نسبة السكان من الطبقة الفقيرة.

MEDV: متوسط قيمة المساكن التي يقطنها ملاك وليس مستأجرين.

2- نحدد القيم المراد التنبؤ بها والمتغيرات المراد دراسة تأثيرها:

سنقوم بالتنبؤ بأسعار المنازل (“MEDV”) باستخدام بقية المتغيرات من خلال الأمر التالي:

predictors = ["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT"]

outcome = "MEDV"-> Create X and y datasets

[X = data[predictors
["y = data["MEDV

3 – بناء نموذج الانحدار:

لبناء النموذج، سنقوم باستخدام مكتبة Statsmodels. يمكن أيضا ً استخدام Scikit-learn لبناء النموذج ولكن في هذا الدرس سنستخدم Scikit-learn لتدريب واختبار النموذج. 

import statsmodels.api as sm (X = sm.add_constant(X

كما هو سائد في هذا النوع من النماذج، سنقوم بتقسيم البيانات لمجموعتين: 80% من البيانات لتدريب النموذج و 20% منها لاختبار النموذج. سيتعلم النموذج من البيانات الموجودة في مجموعة التدريب والتي تكون النتيجة فيها معروفة وبعد تدريب النموذج سنقوم بتعميمه على بقية البيانات في مجموعة الاختبار. سنقوم بالتنبؤ بقيمة y في مجموعة الاختبار ومن ثم مقارنتها مع النتائج الحقيقية التي بحوزتنا للكشف عن مدى فرط التخصيص (Overfitting) أو فرط التعميم (Underfitting). 

تقسيم بيانات الدريب#

from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(X, y, train_size = 0.8, random_state = 42)

نموذج الانحدار الخطي#

(model = sm.OLS(train_y, train_X
()model = model.fit
(()print(model.summary2

4- النتائج:

– عدد الصفوف في البيانات 404 (80% من البيانات المتاحة). 

– قيمة R-squared (والتي تشير إلى جودة النموذج والتي تتراوح قيمتها عادة من 0 إلى 1) هي 0.75 للنموذج الذي قمنا ببنائه. 

– قيمة p-value أكبر من 0.05 لبعض المتغيرات مثل: “NZ”, “INDUS”, “AGE”, “TAX”  وبالتالي سنقوم بحذف هذه المتغيرات بسبب عدم أهميتها بناء على قيمة P والتي تحدد عما إذا كانت العلاقة التي نحاول الكشف عنها في عينة البيانات تبقى موجودة في عينة أكبر. 

5- التنبؤ باستخدام مجموعة الاختبار:

سنقوم باستخدام دالة model.predict للتنبؤ باستخدام test_x ومن ثم مقارنة النتائج مع test_y. 

(predictions = model.predict(test_X ({df_results = pd.DataFrame({‘Actual’: test_y, ‘Predicted’: predictions

6- تقييم النموذج:

من أهم القيم المستخدمة لتقييم النموذج هي: root mean squared error و the square root of the average squared error لقيمة y وتسمى (y-hat) والتي نستطيع من خلالها قياس دقة النموذج.

من القيم المهمة لتقييم النموذج هي قيمة R-squared والتي تتراوح قيمتها بين 0 و 1 والتي تقيس نسبة التباين في البيانات التي يتم احتسابها في نموذج الانحدار وتشير هذه القيمة إلى مدى يكون النموذج متناسب مع البيانات التي تم تحليليها.

لذلك، سنقوم الآن بحساب قيمة كلا ً من  RMSE و R-squared من خلال الأمر التالي:

from sklearn.metrics import r2_score, mean_squared_error RMSE = np.sqrt(mean_squared_error(test_y, predictions r2 = r2_score(test_y, predictions) ((print(RMSE, r2)

RMSE=4.92

R-squared = 0.66

كما يظهر لدينا في نتائج النموذج حينما تم تطبيقه على مجموعة الاختبار، فنلاحظ أن قيمة R-squared انخفضت من 0.75 (في مجموعة التدريب) إلى 0.66 (في مجموعة الاختبار) 

7- فحص النموذج:

عادة قبل البدء ببناء نموذج الانحدار الخطي نفترض ما يلي:

– فرضية الخطية Linearity: وهي افتراض أن العلاقة بين المتغير المستقل والمتغير التابع هي علاقة خطية.

– فرضية التوزيع الطبيعي Normality: وهي أن البواقي residuals تتبع التوزيع الطبيعي Normal distribution والمتوسط المتوقع يساوي صفر. 

– فرضية تجانس التباين Homoscedasticity: وهي افتراض أن اختلاف قيمة الباقي ثابته في جميع قيم X. 

– فرضية عدم وجود الارتباط التلقائي No autocorrelation: وهي افتراض أن قيم البواقي مستقلة عن بعضها البعض. 

– فرضية التداخل الخطي (No multicollinearity): وهي افتراض عدم وجود ارتباط عالي بين المتغيرات المستخدمة للتنبؤ. 

قد يكون الحديث عن قياس أداء النموذج غير واضح مع تعدد أدوات القياس، ولكن قبل الشروع في عملية قياس الأداء من المهم أن نتحقق من مدى تحقق الفرضيات المذكورة آنفا ً. 

7.1- افتراض الخطية:

نفترض أن العلاقة بين المتغير المستخدم للتبؤ والقيمة المراد التنؤ بها هي علاقة خطية وهذا الافتراض قد لا يكون صحيح دائما. عندما نقوم بعملية النمذجة فنحن نحاول تكييف البيانات لدالة تساعدنا في شرح بياناتنا، ولكن الانحدار الخطي قد لا يكون النموذج المناسب لهذه الحالة. لذلك، سنبدأ باختبار هذه الفرضية عن طريق تمثيل العلاقة بين القيم الناتجة عن التنبؤ والقيم الحقيقية باستخدام scatter plot والنتيجة المثالية أن تقع نقاط البيانات حول الخط القطري. 

(sns.lmplot(x=’Actual’, y=’Predicted’, data=df_results, fit_reg=False -> نرسم خط قطري من خلال الأمر التالي: (()d_line= np.arange(df_results.min().min(), df_results.max().max (‘–‘=plt.plot(d_line, d_line, color=’red’, linestyle ()plt.show

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

7.2- فرضية التوزيع الطبيعي Normality: 

هنا فرضية أن البواقي (residuals) توزيعها طبيعي (normally distributed). قد لا تتحقق هذه الفرضية إما بسبب عدم تحقق فرضية الخطية Normality أو بسبب احتواء البيانات على القيم الشاذة أو المتطرفة (outliers). لذلك، سنقوم باختبار فرضية الخطية باستخدام شكلquantile-quantile plot  و  Q-Q plot 

from statsmodels.graphics.gofplots import qqplot (‘fig=qqplot(model.resid_pearson,line=’45’,fit=’True (“plt.xlabel(“Theoretical quantiles (“plt.ylabel(“Sample quantiles ()plt.show

التطابق المثالي في الشكل الظاهر على الجهة اليسرى يظهر بأن توزيع البيانات يتبع الخط باللون الأحمر من أسفل اليسار إلى أعلى اليمين. ولكن، في بيانات بوسطن، نلاحظ أن النموذج الذي قمنا ببنائه متحيز نوعا ما underestimating. كما يمكننا أن نمثل قيم البواقي باستخدام أشكال أخرى مثل (histogram) أو استخدام بعض اختبارات الخطية الأخرى مثل Anderson-Darling  أو   Shapiro-Wilk Test

7.3- فرضية تجانس التباين (Homoscedasticity):

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

((fig, ax = plt.subplots(figsize=(5, 5 sns.regplot(model.fittedvalues,model.resid, scatter_kws={‘alpha’: 0.25}, line_kws=({‘color’: ‘C2’, ‘lw’: 2}, ax=ax (‘ax.set_xlabel(‘predicted (‘ax.set_ylabel(‘residuals ()plt.tight_layout ()plt.show

تُظهر النتيجة المثالية في الجهة اليسرى توزيعا ً موحدا ً للبواقي، ولكن الحالة مختلفة في بيانات بوسطن. نحتاج إلى توخي الحذر بشأن عدم التجانس، مما يشير إلى أن أخطاء التنبؤ تختلف باختلاف نطاق القيم الناتجة عن التنبؤ مما يعني أن نموذجنا قد يكون نموذجا ً غير مكتمل.

7.4- فرضية عدم وجود الارتباط الذاتي (No Autocorrelation):

يحدث هذا الافتراض عندما تكون البواقي ليست مستقلة عن بعضها. وهذا قد يتكرر في بيانات السلاسل الزمنية لأسعار الأسهم. سنقوم بتنفيذ اختبار (Durbin-Watson test) للتأكد من تحقق هذه الفرضية.

from statsmodels.stats.stattools import durbin_watson (durbinWatson = durbin_watson(model.resid (print(durbinWatson

نتيجة اختبار (Durbin-Watson test) تتراوح بين0  و 4 وعندما تكون القيمة 2.0 فهذه دلالة على تحقق الفرضية. 

القيم بين 0 و 2 تشير إلى الارتباط ذاتي السلبي (negative autocorrelation). والنتيجة في البيانات التي قمنا بتحليلها فالنتيجة قريبة جدا من 2.0 وبالتالي فيمكننا القول بأن هذه إشارة على أن الفرضية متحققة. 

7.5- فرضية التداخل الخطي (Multicollinearity):

وهي افتراض أن متغيرات التنبؤ (predictor variables) في الانحدار الخطي غير مترابطة مع بعضها البعض. عدم تحقق هذه النظرية لا يعني أن النموذج غير قابل للتطبيق ولكن علينا أولا ً تحديد المتغيرات الغير هامة اذا كانت مترابطة ارتباطا ً قويا ً مع المتغيرات الأخرى.

سنقوم بتمثيل الارتباط بين متغيرات التنبؤ على شكل خريطة حرارية heatmap وسنقوم أيضا ً بالتحقق من قيم الارتباط بين هذه المتغيرات عن طريق حساب (variance inflation factor (VIF والذي يقيس الارتباط الذاتي بين متغيرات التنبؤ.

(()mask = np.zeros_like(train_X.drop(“const”, axis=1).corr mask[np.triu_indices_from(mask)] = True ,(sns.heatmap(train_X.drop(“const”, axis=1).corr().round(2 (“annot=True, mask=mask, cmap=”cividis

كما يظهر لدينا، يمكننا ملاحظة وجود ارتباط عالي بنوعيه السلبي والايجابي في بيانات بوسطن التي نعمل عليها، لذلك سنجري اختبار VIF.

from statsmodels.stats.outliers_influence import variance_inflation_factor as vif :((for i in range(len(X.columns (v=vif(np.matrix(X),i :{}print(“Variance inflation factor for (((.format(X.columns[i],round(v,2″{}

VIF for CRIM: 1.79
VIF for ZN: 2.3
VIF for INDUS: 3.99
VIF for CHAS: 1.07
VIF for NOX: 4.39
VIF for RM: 1.93
VIF for AGE: 3.1
VIF for DIS: 3.96
VIF for RAD: 7.48
VIF for TAX: 9.01
VIF for PTRATIO: 1.8
VIF for B: 1.35
VIF for LSTAT: 2.94

يمكن تفسير نتائج اختبار VIF على النحو التالي:

إذا كانت قيمة VIF تساوي 1 فهذا يعني بأن هناك متغيرين من متغيرات التنبؤ ليست مترابطة.

وإذا كانت قيمة VIF بين 1 و 5 فهذا يشير إلى وجود ارتباط متوسط. 

وأما إذا كانت قيمة VIF أعلى من 5 فهذا يشير إلى وجود ارتباط عالي بين متغيرين. 

8 – القيم الشاذة أو المتطرفة (Outliers):

سنقوم بالكشف عن القيم المتطرفة باستخدام شكل Cook’s distance. 

تحدد مسافة كوك تأثير حذف ملاحظات معينة (observations) من مجموعة البيانات. كما يمكننا الاستفادة من مسافة كوك أثناء عملية الاختبار ما إذا كانت ملاحظة معينة قد تشكل قيمة متطرقة أو متغيرا ً مؤثرا ً. ونستطيع عمل هذا الشكل من خلال الأمر التالي: 

from statsmodels.stats.outliers_influence import OLSInfluence as influence (inf=influence(model i, d) = inf.cooks_distance) (“plt.title(“Cook’s distance plot (“,”=plt.stem(np.arange(len(i)), i, markerfmt ()plt.show

من خلال تمثيل كوك نستطيع أن نحدد القيم التي بحاجة إلى فحص إضافي وتحديد إمكانية حذفها. وكقاعدة عامة، تكون القيمة ذات تأثير عالي إذا كانت مسافة كوك أعلى من 4/N-K-1 حيث N تساوي عدد الملاحظات في البيانات (observations)، و K تساوي عدد متغيرات التنبؤ.

9- الخاتمة:

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

وبالنظر إلى نتائج النموذج الذي قمنا ببنائه استنادا ًعلى بيانات مدينة بوسطن، فيمكننا محاولة تحسين أداء هذا النموذج من خلال بعض الأدوات منها Random Forest Regressor و XGBoost. كما يمكننا مواصلة تحسين النموذج من خلال تحليل المكون الرئيسي analysis-PCA لتحديد وحذف بعض متغيرات التنبؤ الأقل أهمية مع الاحتفاظ بالمتغيرات الأكثر الأهمية.

أيضا ً، يمكننا استخدام ما يسمى باختبار المصادقة (K-fold Cross Validation(CV عن طريق تقسيم البيانات لعدة أجزاء K تسمى folds ومن ثم استخدام كل جزء كمجموعة اختبار testing set. 

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

المصدر:

https://towardsdatascience.com/linear-regression-model-with-python-481c89f0f05b