Python – رگرسیون چندجملهای (Polynomial Regression)
رگرسیون چندجملهای
اگر نقاط داده شما به وضوح نمیتوانند با رگرسیون خطی (یک خط مستقیم) مناسب شوند، ممکن است رگرسیون چندجملهای گزینه مناسبی باشد.
رگرسیون چندجملهای، مشابه رگرسیون خطی، از رابطه بین متغیرهای x و y برای یافتن بهترین روش برای رسم یک خط (در واقع یک منحنی) از طریق نقاط داده استفاده میکند.
چگونه کار میکند؟
پایتون متدهایی برای یافتن رابطه بین نقاط داده و رسم منحنی رگرسیون چندجملهای دارد. در اینجا، به جای استفاده از فرمولهای ریاضی، میتوانیم از این متدها استفاده کنیم.
در مثال زیر، سرعت و ساعت روز (ساعت) 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 نشان میدهد که رابطه بسیار ضعیف است و این مجموعه داده برای رگرسیون چندجملهای مناسب نیست.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام