رگرسیون چند جملهای
اگر نقاط داده شما بطور واضح با رگرسیون خطی سازگار نبود (یک خط صاف در میان همه نقاط داده)، ممکن است برای رگرسیون چند جملهای مناسب باشد.[۱]
رگرسیون چند جمله ای، مانند رگرسیون خطی، از رابطه بین متغیر 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)))
منابع آموزشی