تعلم الآلة - الانحدار متعدد الحدود
الانحدار متعدد الحدود
إذا كان من الواضح أن نقاط البيانات الخاصة بك لن تتناسب مع الانحدار الخطي (خط مستقيم عبر جميع نقاط البيانات) ، فقد يكون ذلك مثاليًا للانحدار متعدد الحدود.
يستخدم الانحدار متعدد الحدود ، مثل الانحدار الخطي ، العلاقة بين المتغيرين x و y لإيجاد أفضل طريقة لرسم خط عبر نقاط البيانات.
كيف يعمل؟
لدى Python طرقًا لإيجاد علاقة بين نقاط البيانات ورسم خط انحدار متعدد الحدود. سنوضح لك كيفية استخدام هذه الطرق بدلاً من المرور بالصيغة الرياضية.
في المثال أدناه ، قمنا بتسجيل 18 سيارة لأنها كانت تمر عبر كشك رسوم معين.
لقد سجلنا سرعة السيارة والوقت من اليوم (بالساعة) الذي حدث فيه المرور.
يمثل المحور السيني ساعات اليوم ويمثل المحور الصادي السرعة:
مثال
ابدأ برسم مخطط مبعثر:
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
نتيجة:
مثال
استيراد numpy
ثم
matplotlib
رسم خط الانحدار متعدد الحدود:
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
نتيجة:
شرح المثال
قم باستيراد الوحدات التي تحتاجها.
يمكنك التعرف على وحدة NumPy في برنامجنا التعليمي NumPy .
يمكنك التعرف على وحدة SciPy في دروسنا SciPy .
import numpy
import matplotlib.pyplot as plt
قم بإنشاء المصفوفات التي تمثل قيم المحور x و y:
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
لدى NumPy طريقة تتيح لنا إنشاء نموذج متعدد الحدود:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
ثم حدد كيف سيعرض الخط ، نبدأ من الموضع 1 ، وننتهي عند الموضع 22:
myline = numpy.linspace(1, 22, 100)
ارسم مخطط التبعثر الأصلي:
plt.scatter(x, y)
ارسم خط الانحدار متعدد الحدود:
plt.plot(myline, mymodel(myline))
اعرض الرسم التخطيطي:
plt.show()
R- تربيع
من المهم معرفة مدى جودة العلاقة بين قيم المحور x و y ، إذا لم تكن هناك علاقة لا يمكن استخدام الانحدار متعدد الحدود للتنبؤ بأي شيء.
يتم قياس العلاقة بقيمة تسمى r-squared.
تتراوح قيمة r-squared من 0 إلى 1 ، حيث يعني 0 عدم وجود علاقة ، ويعني 1 أنه متصل بنسبة 100٪.
ستحسب Python ووحدة Sklearn هذه القيمة نيابة عنك ، كل ما عليك فعله هو إطعامها بمصفوفتي x و y:
مثال
ما مدى ملاءمة بياناتي في الانحدار متعدد الحدود؟
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
ملاحظة: تظهر النتيجة 0.94 أن هناك علاقة جيدة جدًا ، ويمكننا استخدام الانحدار متعدد الحدود في التنبؤات المستقبلية.
توقع القيم المستقبلية
الآن يمكننا استخدام المعلومات التي جمعناها للتنبؤ بالقيم المستقبلية.
مثال: دعونا نحاول أن نتنبأ بسرعة سيارة تمر عبر كشك الرسوم في حوالي الساعة 17 مساءً:
للقيام بذلك ، نحتاج إلى نفس mymodel
المصفوفة من المثال أعلاه:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
مثال
توقع سرعة مرور السيارة في الساعة 17 مساءً:
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)
توقع المثال أن تكون السرعة 88.87 ، ويمكننا أيضًا قراءتها من الرسم التخطيطي:
تناسب سيئة؟
لنقم بإنشاء مثال حيث لن يكون الانحدار متعدد الحدود هو أفضل طريقة للتنبؤ بالقيم المستقبلية.
مثال
يجب أن تؤدي هذه القيم للمحور x و y إلى ملاءمة سيئة للغاية للانحدار متعدد الحدود:
import numpy
import matplotlib.pyplot as plt
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]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
نتيجة:
وقيمة مربع r؟
مثال
يجب أن تحصل على قيمة تربيع منخفضة جدًا.
import numpy
from sklearn.metrics import r2_score
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]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
النتيجة: 0.00995 تشير إلى علاقة سيئة للغاية ، وتخبرنا أن مجموعة البيانات هذه غير مناسبة لانحدار متعدد الحدود.