التراجع الخطي في التعلم الآلي

التراجع

عند محاولة العثور على علاقة بين المتغيرات، يتم استخدام المصطلح "التراجع" (regression).

في التعلم الآلي وتصميم الإحصاء، يستخدم هذا العلاقة لتنبؤ نتائج الأحداث المستقبلية.

الأسلوب الخطي

يستخدم الأسلوب الخطي علاقات النقاط لرسم خط مستقيم عبر جميع النقاط.

يمكن استخدام هذا الخط لتنبؤ القيم المستقبلية.


في التعلم الآلي، تنبؤ القيم المستقبلية مهم جدًا.

العملية

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

في المثال التالي، المحور x يمثل العمر، والمحور y يمثل السرعة. لقد سجلنا أعمار وسرعات 13 سيارة عند مرورها عبر ممر الرسوم.

مثال

أولاً، قم برسم رسم بياني للنقاط:

import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()

النتيجة:


تشغيل مثال

مثال

استيراد scipy و رسم خط الأسلوب الخطي:

import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

النتيجة:


تشغيل مثال

شرح المثال

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

import matplotlib.pyplot as plt
from scipy import stats

إنشاء مصفوفة تعبر عن قيم المحور x والمحور y:

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

تفيذ طريقة تعود بعض المفاتيح المهمة للأسلوب الخطي:

slope, intercept, r, p, std_err = stats.linregress(x, y)

إنشاء شيء يستخدم المنحدر و القطاع وظيفة القيم تعود قيمة جديدة. هذه القيمة الجديدة تعبر عن الموقع الذي سيتم وضع القيمة الم相应ة في المحور y:

def myfunc(x):
  return slope * x + intercept

مرور كل قيمة من مصفوفة x عبر الوظيفة. هذا سيكون مصفوفة جديدة تحتوي على قيم جديدة لـ y المحور:

mymodel = list(map(myfunc, x))

رسم رسم بياني للنقاط الأصلية:

plt.scatter(x, y)

رسم خط الأسلوب الخطي:

plt.plot(x, mymodel)

عرض الرسم البياني:

plt.show()

الرابعي

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

يُقاس هذا العلاقة بواسطة قيمة r^2 (الرابعي)

مقدار r^2 يتراوح بين 0 و 1، حيث 0 يعني عدم وجود علاقة، و 1 يعني علاقة 100٪.

Python و مكتبة Scipy ستقوم بحساب هذا القيمة لك، وكل ما تحتاجه هو تقديم قيم x و y لها:

مثال

كيف يبدو تطابق بياناتي في الأسلوب الخطي؟

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

تشغيل مثال

التعليقات:النتيجة -0.76 تشير إلى وجود علاقة ما، لكنها ليست علاقة مثالية، لكنها تشير إلى أننا يمكن استخدام الأسلوب الخطي في التنبؤات المستقبلية.

تنبؤ القيم المستقبلية

الآن، يمكننا استخدام المعلومات التي جمعناها لتنبؤ القيم المستقبلية.

على سبيل المثال: لنحاول تنبؤ سرعة السيارة التي تحتوي على 10 سنوات من العمر.

للقيام بذلك، نحتاج إلى نفس myfunc() الوظيفة:

def myfunc(x):
  return slope * x + intercept

مثال

تنبؤ سرعة السيارة التي تحتوي على 10 سنوات من العمر:

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
speed = myfunc(10)
print(speed)

تشغيل مثال

سرعة التنبؤ هي 85.6، ونستطيع أيضًا قراءتها من الرسم البياني:


مقدار التطابق السيء؟

لنقم بإنشاء مثال حيث ليس الأسلوب الخطي أفضل طريقة لتنبؤ القيم المستقبلية.

مثال

هذه القيم في المحور x وy ستؤدي إلى سوء التكيف بشكل سيء للغاية للتراجع الخطي:}

import matplotlib.pyplot as plt
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

النتيجة:


تشغيل مثال

و أيضًا قيمة r-squared؟

مثال

يجب أن تكون قد حصلت على قيمة منخفضة جدًا من r-squared.

import numpy
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

تشغيل مثال

النتيجة: 0.013 يعني علاقة سيئة للغاية، ويخبرنا أن هذه البيانات غير مناسبة للتراجع الخطي.