رگرسیون چندجمله ای (Polynomial Regression)
رگرسیون چندجمله ای یعنی با یک تابع چندجمله ای، روند داده را مدل کنیم. اگر خط مستقیم جواب نداد، این روش کمک می کند. متغیر (Variable) یعنی مقداری که تغییر می کند. این روش بین x و y یک منحنی مناسب می سازد.
چه زمانی از رگرسیون چندجمله ای استفاده کنیم؟
وقتی داده ها خطی نیستند، خط صاف جواب نمی دهد. در این حالت، چندجمله ای الگو را بهتر می گیرد. مثل شلوغی خیابان که در طول روز موجی تغییر می کند.
1) رسم نمودار پراکندگی
اول نقطه ها را ببین. محور 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()
2) ساخت مدل چندجمله ای با NumPy
با NumPy یک چندجمله ای می سازیم. سپس با linspace یک بازه نرم می گیریم و منحنی را می کشیم.
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()
نکته: درجه 3 یعنی جمله های تا x³ را داریم. هرچه درجه بالاتر، پیچیدگی بیشتر می شود.
3) سنجش خوبی مدل با r²
r² بین 0 تا 1 است. صفر یعنی مدل بی فایده. نزدیک 1 یعنی مدل خیلی خوب. از r2_score برای محاسبه استفاده می کنیم.
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 یعنی مدل خیلی خوب داده ها را توضیح می دهد.
4) پیش بینی مقدار جدید
حالا با مدل، سرعت در ساعت 17 را حدس بزنیم. کافی است x=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 پیش بینی می شود. روی نمودار نیز همین دیده می شود.
5) وقتی مدل بد جا می افتد
گاهی داده ها بی نظم هستند. چندجمله ای هم خوب نمی نشیند. نمودار زیر نمونه بدفیت است.
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 یعنی رابطه بسیار ضعیف است. این داده برای چندجمله ای مناسب نیست.
جمع بندی سریع
- اگر خط جواب نداد، چندجمله ای را امتحان کن.
- با polyfit مدل چندجمله ای بساز.
- با r² کیفیت مدل را بسنج.
- پیش بینی با mymodel(x) انجام می شود.
- رگرسیون خطی پایه خوبی برای شروع است.