تعلم الآلة - الانحدار الخطي
تراجع
يستخدم مصطلح الانحدار عندما تحاول إيجاد العلاقة بين المتغيرات.
في التعلم الآلي ، وفي النمذجة الإحصائية ، تُستخدم هذه العلاقة للتنبؤ بنتيجة الأحداث المستقبلية.
الانحدارالخطي
يستخدم الانحدار الخطي العلاقة بين نقاط البيانات لرسم خط مستقيم من خلالها.
يمكن استخدام هذا الخط للتنبؤ بالقيم المستقبلية.
في التعلم الآلي ، التنبؤ بالمستقبل مهم جدًا.
كيف يعمل؟
لدى 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()
نتيجة:
شرح المثال
قم باستيراد الوحدات التي تحتاجها.
يمكنك التعرف على وحدة Matplotlib في دروسنا Matplotlib .
يمكنك التعرف على وحدة SciPy في دروسنا SciPy .
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)
قم بإنشاء دالة تستخدم القيم slope
و
intercept
لإرجاع قيمة جديدة. تمثل هذه القيمة الجديدة حيث سيتم وضع قيمة x المقابلة على المحور y:
def myfunc(x):
return slope * x + intercept
قم بتشغيل كل قيمة من قيم المصفوفة x من خلال الوظيفة. سينتج عن ذلك مصفوفة جديدة بقيم جديدة للمحور الصادي:
mymodel = list(map(myfunc, x))
ارسم مخطط التبعثر الأصلي:
plt.scatter(x, y)
ارسم خط الانحدار الخطي:
plt.plot(x, mymodel)
اعرض الرسم التخطيطي:
plt.show()
R للعلاقة
من المهم معرفة العلاقة بين قيم المحور السيني وقيم المحور الصادي ، إذا لم تكن هناك علاقة لا يمكن استخدام الانحدار الخطي للتنبؤ بأي شيء.
هذه العلاقة - معامل الارتباط - تسمى
r
.
تتراوح r
القيمة من -1 إلى 1 ، حيث يعني 0 عدم وجود علاقة ، ويعني 1 (و -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
عن العلاقة؟
مثال
يجب أن تحصل على r
قيمة منخفضة للغاية.
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 تشير إلى علاقة سيئة للغاية ، وتخبرنا أن مجموعة البيانات هذه غير مناسبة للانحدار الخطي.