Học máy - Phản hồi đa thức

Hồi quy đa thức (Polynomial Regression)

Nếu các điểm dữ liệu của bạn rõ ràng không phù hợp với hồi quy tuyến tính (đường thẳng xuyên qua các điểm dữ liệu), thì hồi quy đa thức có thể là lựa chọn lý tưởng.

Như hồi quy tuyến tính, hồi quy đa thức sử dụng mối quan hệ giữa biến x và y để tìm phương pháp tốt nhất để vẽ đường cho điểm dữ liệu.


Công việc

Python có một số phương pháp để tìm mối quan hệ giữa điểm dữ liệu và vẽ đường hồi quy đa thức. Chúng ta sẽ hướng dẫn bạn cách sử dụng các phương pháp này thay vì thông qua công thức toán học.

Trong ví dụ sau, chúng ta đã đăng ký 18 xe qua trạm thu phí cụ thể.

Chúng ta đã ghi lại tốc độ xe và thời gian qua (giờ).

Trục x biểu thị giờ trong ngày, trục y biểu thị tốc độ:

Ví Dụ

Trước tiên vẽ biểu đồ điểm:

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

Kết Quả:


Chạy Ví Dụ

Ví Dụ

t导入 numpymatplotlibvà sau đó vẽ đường hồi quy đa thức:

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

Kết Quả:


Chạy Ví Dụ

Giải thích ví dụ

T导入 mô-đun cần thiết:

import numpy
import matplotlib.pyplot as plt

Tạo mảng biểu diễn giá trị của trục x và trục 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 có một phương pháp để chúng ta xây dựng mô hình đa thức:

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

Sau đó chỉ định cách hiển thị của dòng, chúng ta bắt đầu từ vị trí 1 và kết thúc ở vị trí 22:

myline = numpy.linspace(1, 22, 100)

Vẽ biểu đồ điểm ban đầu:

plt.scatter(x, y)

Vẽ đường hồi quy đa thức:

plt.plot(myline, mymodel(myline))

Hiển thị biểu đồ:

plt.show()

R-Squared

Điều quan trọng là phải biết mối quan hệ giữa giá trị của trục x và trục y có tốt đến mức nào, nếu không có mối quan hệ, hồi quy đa thức không thể được sử dụng để dự đoán bất cứ điều gì.

Mối quan hệ này được đo lường bằng giá trị r-squared (r-squared).

Phạm vi của giá trị r-squared là từ 0 đến 1, trong đó 0 biểu thị không có mối quan hệ, còn 1 biểu thị 100% có mối quan hệ.

Python và mô-đun Sklearn sẽ tính toán giá trị này cho bạn, điều bạn cần làm chỉ là nhập vào mảng x và y:

Ví Dụ

Kết hợp của dữ liệu của tôi trong hồi quy đa thức như thế nào?

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

Chạy Ví Dụ

Chú thích:Kết quả 0.94 cho thấy có mối quan hệ tốt, chúng ta có thể sử dụng hồi quy đa thức trong các dự đoán tương lai.

Dự đoán giá trị tương lai

Bây giờ, chúng ta có thể sử dụng thông tin đã thu thập để dự đoán giá trị tương lai.

Ví dụ: hãy thử dự đoán tốc độ xe qua trạm thu phí vào khoảng 17 giờ tối:

Để làm điều này, chúng ta cần cùng một ví dụ như trên: mymodel Mảng:

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

Ví Dụ

Dự đoán tốc độ xe qua vào buổi chiều 17 giờ:

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)

Chạy Ví Dụ

Tốc độ dự đoán của ví dụ này là 88.87, chúng ta cũng có thể thấy trong hình vẽ:


Kết hợp kém?

Hãy tạo một ví dụ, trong đó phương pháp hồi quy đa thức không phải là phương pháp tốt nhất để dự đoán giá trị tương lai.

Ví Dụ

Các giá trị này của trục x và y sẽ dẫn đến độ phù hợp của phân hồi đa thức rất kém:

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

Kết Quả:


Chạy Ví Dụ

Giá trị r-squared là gì?

Ví Dụ

Bạn nên nhận được một giá trị r-squared rất thấp.

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

Chạy Ví Dụ

Kết Quả: 0.00995 biểu thị mối quan hệ rất yếu, và cho chúng ta biết rằng bộ dữ liệu này không phù hợp với phân hồi đa thức.