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

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو
Main Page Tutorial
Python-menu.png
موارد آموزشی
مدیریت فایل
یادگیری ماشین
۱شروع کار
۲میانگین، میانه، مُد
۳انحراف استاندارد
۴صدک
۵توزیع داده
۶توزیع داده نرمال
۷نمودار پراکندگی
۸رگرسیون خطی
۹رگرسیون چند جمله‌ای
۱۰رگرسیون چندگانه
۱۱مقیاس
۱۲آموزش / تست
۱۳درخت تصمیم
MySQL در پایتون
MongoDB در پایتون
مرجع پایتون
مرجع ماژول
چگونه در پایتون؟
مثال‌های پایتون

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

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

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

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

در مثال زیر، ۱۸ ماشین را هنگام عبور از گیشه دریافت عوارض ثبت کرده‌ایم و ما سرعت ماشین و زمان روز (ساعت) عبور را ثبت کرده‌ایم.

این محور x نشان دهندهٔ ساعت‌های روز و محور y نشان دهنده سرعت است:

مثال

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

1 import matplotlib.pyplot as plt
2 
3 x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
4 y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
5 
6 plt.scatter(x, y)
7 plt.show()

نتیجه


مشاهدهٔ نتیجه


مثال

numpy و matplotlib را import کرده و سپس خط رگرسیون چندجمله ای را رسم می‌کنیم:

 1 import numpy
 2 import matplotlib.pyplot as plt
 3 
 4 x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
 5 y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
 6 
 7 mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
 8 
 9 myline = numpy.linspace(1, 22, 100)
10 
11 plt.scatter(x, y)
12 plt.plot(myline, mymodel(myline))
13 plt.show()

نتیجه


مشاهدهٔ نتیجه


توضیح مثال

ماژول‌های مورد نیاز را import می‌کند:

1 import numpy
2 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))

سپس نحوه نمایش خط را مشخص می‌کند، از مکان ۱ شروع می‌کند و در مکان ۲۲ به پایان می‌رسد:

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 از ۰ تا ۱ است که ۰ یعنی هیچ رابطه ای وجود ندارد و ۱ یعنی ۱۰۰٪ بهم مرتبط‌اند.

پایتون و ماژول Sklearn این مقدار را برای شما محاسبه می‌کنند، تنها کاری که لازم است بکنید دادن مقدارهای x و y به آن است

مثال

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

1 import numpy
2 from sklearn.metrics import r2_score
3 
4 x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
5 y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
6 
7 mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
8 
9 print(r2_score(y, mymodel(x)))


مشاهدهٔ نتیجه


توجه: نتیجه ۰٫۹۴ نشان می‌دهد که رابطه خیلی خوبی وجود دارد، و می‌توانیم از رگرسیون چندجمله ای برای پیش بینی‌های آینده استفاده کنیم.

پیش بینی مقدارهای آینده

حال می‌توانیم از اطلاعاتی کخ جمع آوری کرده‌ایم برای پیش بینی مقادیر آینده استفاده کنیم.

مثال: می‌خواهیم سرعت ماشینی را که از گیشه دریافت عوارض عبور می‌کند را در حدود ساعت ۱۷ بعدازظهر پیش بینی کنیم:

برای این کار، به تابع mymodel مشابه مثال بالا نیاز داریم:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

مثال

سرعت ماشین در حال عبور در ۱۷ بعدازظهر را پیش بینی می‌کند:

 1 import numpy
 2 from sklearn.metrics import r2_score
 3 
 4 x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
 5 y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
 6 
 7 mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
 8 
 9 speed = mymodel(17)
10 print(speed)


مشاهدهٔ نتیجه


این مثال سرعت را ۸۸٫۸۷ پیش بینی می‌کند که می‌توانیم از روی نمودار هم بخوانیم:

سازگاری بد؟

می‌خواهیم مثالی تعریف کنیم که رگرسیون چند جمله ای بهترین متد برای پیش بینی مقدارهای آینده نیست.

مثال

این مقدارها برای محورهای x و y باید منجر به سازگاری بد با رگرسیون چند جمله ای شوند:

 1 import numpy
 2 import matplotlib.pyplot as plt
 3 
 4 x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
 5 y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
 6 
 7 mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
 8 
 9 myline = numpy.linspace(2, 95, 100)
10 
11 plt.scatter(x, y)
12 plt.plot(myline, mymodel(myline))
13 plt.show()

نتیجه


مشاهدهٔ نتیجه


و مقدار r-squared؟

مثال

باید مقدار r-squared خیلی پایین به دست آید.

1 import numpy
2 from sklearn.metrics import r2_score
3 
4 x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
5 y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
6 
7 mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
8 
9 print(r2_score(y, mymodel(x)))


مشاهدهٔ نتیجه


نتیجه: ۰٫۰۰۹۹۵ نشان دهنده یک رابطه خیلی بد است و به ما می‌گوید که این داده‌ها برای رگرسیون چند جمله ای مناسب نیستند.


منابع آموزشی