Python – رگرسیون چندجمله‌ای (Polynomial Regression)

رگرسیون چندجمله‌ای

اگر نقاط داده شما به وضوح نمی‌توانند با رگرسیون خطی (یک خط مستقیم) مناسب شوند، ممکن است رگرسیون چندجمله‌ای گزینه مناسبی باشد.

رگرسیون چندجمله‌ای، مشابه رگرسیون خطی، از رابطه بین متغیرهای xx و yy برای یافتن بهترین روش برای رسم یک خط (در واقع یک منحنی) از طریق نقاط داده استفاده می‌کند.

چگونه کار می‌کند؟

پایتون متدهایی برای یافتن رابطه بین نقاط داده و رسم منحنی رگرسیون چندجمله‌ای دارد. در اینجا، به جای استفاده از فرمول‌های ریاضی، می‌توانیم از این متدها استفاده کنیم.

در مثال زیر، سرعت و ساعت روز (ساعت) 18 خودرو را هنگام عبور از یک ایستگاه عوارض ثبت کرده‌ایم. محور x نمایانگر ساعت‌های روز و محور y نمایانگر سرعت است:

مثال

ابتدا نمودار پراکندگی را رسم کنید:

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()

توضیح مثال

  • ماژول‌های مورد نیاز را وارد کنید:
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-Squared

مهم است که بدانید رابطه بین مقادیر محور x و مقادیر محور y چقدر خوب است. اگر رابطه‌ای وجود نداشته باشد، رگرسیون چندجمله‌ای نمی‌تواند برای پیش‌بینی استفاده شود.

رابطه با مقداری به نام r-squared اندازه‌گیری می‌شود. مقدار r-squared از 0 تا 1 متغیر است، که 0 به معنی عدم رابطه و 1 به معنی 100% رابطه است.

مثال چقدر داده‌های من در رگرسیون چندجمله‌ای مناسب هستند؟

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-squared؟ مثال باید مقدار r-squared بسیار پایینی دریافت کنید:

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 نشان می‌دهد که رابطه بسیار ضعیف است و این مجموعه داده برای رگرسیون چندجمله‌ای مناسب نیست.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
JavaScript - آرایه‌ها (Arrays)

JavaScript – آرایه‌ها (Arrays)

آرایه در جاوااسکریپت متغیری خاص است که می‌تواند بیش از یک مقدار را ذخیره کند. const cars = ["Saab",...

بیشتر بخوانید
JavaScript - ویژگی‌های عدد (Number Properties)

JavaScript – ویژگی‌های عدد (Number Properties)

در جاوااسکریپت، شیء Number شامل ویژگی‌هایی از پیش تعریف‌شده است که برای کار با اعداد مفید هستند. این ویژگی‌ها...

بیشتر بخوانید
JavaScript - متدهای عدد (Number Methods)

JavaScript – متدهای عدد (Number Methods)

در جاوا اسکریپت، متدهایی برای کار با اعداد ارائه شده‌اند که می‌توانند روی تمامی اعداد استفاده شوند. متدهای مربوط...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.