تُعد الانحدار التدريجي تقنية قوية لاختيار متغيرات التنبؤ الأكثر صلة في نموذج الانحدار. من خلال إضافة أو إزالة المتغيرات بشكل متكرر بناءً على الدلالة الإحصائية، يساعد ذلك في بناء نماذج اقتصادية أسهل في التفسير وأقل عرضة للإفراط في التجهيز. تستكشف هذه المقالة طرقًا مختلفة لأداء الانحدار التدريجي في بايثون، باستخدام مكتبات شائعة مثل statsmodels
و scikit-learn
(sklearn
) و mlxtend
.
جدول المحتويات
- الانتقاء الأمامي
- الإزالة العكسية
- الانتقاء التدريجي (ثنائي الاتجاه)
- الانحدار التدريجي مع
statsmodels
- الانحدار التدريجي مع
sklearn
- الانحدار التدريجي مع
mlxtend
- اختيار الطريقة المناسبة والاعتبارات
الانتقاء الأمامي
يبدأ الانتقاء الأمامي بنموذج فارغ ويضيف بشكل متكرر متغير التنبؤ الذي يحسن بشكل كبير ملاءمة النموذج. يتم تقييم هذا التحسن عادةً باستخدام مقاييس مثل إحصائية F، أو معيار المعلومات Akaike (AIC)، أو معيار المعلومات Bayesian (BIC). تستمر هذه العملية حتى لا يوفر إضافة متغير آخر تحسينًا ذا دلالة إحصائية.
الإزالة العكسية
تتخذ الإزالة العكسية النهج المعاكس. تبدأ بنموذج يتضمن جميع متغيرات التنبؤ، ويزيل بشكل متكرر المتغير الأقل دلالة. يتم إزالة المتغير الذي يحتوي على أعلى قيمة p (أو أقل قيمة إحصائية F) في كل خطوة، بشرط ألا يؤدي إزالته إلى تفاقم ملاءمة النموذج بشكل كبير. يستمر هذا حتى يؤدي إزالة أي متغير متبقي إلى تدهور أداء النموذج بشكل كبير.
الانتقاء التدريجي (ثنائي الاتجاه)
يُجمع الانتقاء التدريجي بين نقاط القوة للانتقاء الأمامي والإزالة العكسية. يبدأ إما بنموذج فارغ (مثل الانتقاء الأمامي) أو نموذج كامل (مثل الإزالة العكسية) ويضيف أو يزيل المتغيرات بشكل متكرر بناءً على أهميتها. يسمح هذا بمجموعة فرعية أكثر مرونة وربما مثالية من المتنبئات.
الانحدار التدريجي مع statsmodels
لا تحتوي statsmodels
على دالة انحدار تدريجي مدمجة، ولكن يمكننا تنفيذ الانتقاء الأمامي يدويًا باستخدام نموذج OLS
(المربعات الصغرى العادية):
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
# بيانات عينة
data = {'y': [10, 12, 15, 18, 20, 22, 25, 28, 30, 32],
'x1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'x2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
'x3': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]}
df = pd.DataFrame(data)
def forward_selection(data, target, significance_level=0.05):
included = []
while True:
changed=False
excluded = list(set(data.columns)-set(included)-{target})
best_pvalue = 1.0
best_feature = None
for new_column in excluded:
model = sm.OLS(target, sm.add_constant(data[included+[new_column]])).fit()
pvalue = model.pvalues[new_column]
if pvalue < best_pvalue:
best_pvalue = pvalue
best_feature = new_column
if best_pvalue < significance_level:
included.append(best_feature)
changed=True
if not changed: break
return included
selected_features = forward_selection(df, df['y'])
print(f"المتغيرات المختارة: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())
الانحدار التدريجي مع sklearn
تستخدم sklearn
إزالة الميزة التكرارية (RFE) لاختيار الميزة. تقوم RFE بإزالة الميزات بشكل متكرر بناءً على درجات أهميتها من نموذج أساسي (مثل الانحدار الخطي):
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split
X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
rfe = RFE(model, n_features_to_select=2) # ضبط حسب الحاجة
rfe = rfe.fit(X_train, y_train)
print(f"المتغيرات المختارة: {X.columns[rfe.support_]}")
final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-squared على مجموعة الاختبار: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")
الانحدار التدريجي مع mlxtend
يوفر SequentialFeatureSelector
في mlxtend
طريقة ملائمة لأداء الانتقاء الأمامي، أو العكسي، أو التدريجي:
from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression
model = LinearRegression()
sfs = SFS(model, k_features='best', forward=True, floating=False, scoring='r2', cv=5) #الانتقاء الأمامي
sfs = sfs.fit(X, y)
print(f"المتغيرات المختارة: {list(sfs.k_feature_idx_)}")
final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)
اختيار الطريقة المناسبة والاعتبارات
يعتمد اختيار طريقة الانحدار التدريجي (الأمامي، العكسي، أو التدريجي) والمكتبة المستخدمة على مجموعة البيانات والأهداف المحددة. تذكر مراعاة:
- حجم البيانات: قد تكون الإزالة العكسية مكلفة من الناحية الحسابية مع عدد كبير من المتنبئات.
- الترابط المتعدد: قد تكافح الطرق التدريجية مع المتنبئات المرتبطة ارتباطًا وثيقًا.
- التفسير مقابل دقة التنبؤ: قد يكون النموذج الأبسط (عدد أقل من المتغيرات) أسهل في التفسير، حتى لو كان أقل دقة قليلاً.
- التحقق المتبادل: تحقق دائمًا من صحة نموذجك باستخدام تقنيات مثل التحقق المتبادل k-fold لضمان قابلية التعميم.
يجب استخدام الانحدار التدريجي بحذر. قد يؤدي إلى نماذج غير مستقرة لا تتعمم بشكل جيد على بيانات جديدة. ضع في اعتبارك استكشاف طرق اختيار الميزات الأخرى مثل LASSO أو انحدار Ridge، والتي تتضمن التنظيم للتعامل مع الإفراط في التجهيز.