Học máy - Hồi quy đa thức
Hồi quy đa thức
Nếu các điểm dữ liệu của bạn rõ ràng sẽ không phù hợp với một hồi quy tuyến tính (một đường thẳng xuyên qua tất cả các điểm dữ liệu), thì nó có thể là lý tưởng cho hồi quy đa thức.
Hồi quy đa thức, giống như hồi quy tuyến tính, sử dụng mối quan hệ giữa các biến x và y để tìm cách tốt nhất để vẽ một đường thẳng qua các điểm dữ liệu.
Làm thế nào nó hoạt động?
Python có các phương pháp để tìm mối quan hệ giữa các điểm dữ liệu và để vẽ một đường hồi quy đa thức. Chúng tôi sẽ chỉ cho bạn cách sử dụng các phương pháp này thay vì đi qua công thức toán học.
Trong ví dụ dưới đây, chúng tôi đã đăng ký 18 chiếc ô tô khi chúng đi qua một trạm thu phí nhất định.
Chúng tôi đã đăng ký tốc độ của ô tô và thời gian trong ngày (giờ) xảy ra.
Trục x biểu thị giờ trong ngày và trục y biểu thị tốc độ:
Thí dụ
Bắt đầu bằng cách vẽ một biểu đồ phân tán:
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ả:
Thí dụ
Nhập numpy
và
matplotlib
sau đó vẽ dò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ả:
Giải thích ví dụ
Nhập các mô-đun bạn cần.
Bạn có thể tìm hiểu về mô-đun NumPy trong Hướng dẫn NumPy của chúng tôi .
Bạn có thể tìm hiểu về mô-đun SciPy trong Hướng dẫn SciPy của chúng tôi .
import numpy
import matplotlib.pyplot as plt
Tạo các mảng đại diện cho các giá trị của trục x và 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 thức cho phép chúng ta tạo một mô hình đa thức:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Sau đó chỉ định cách dòng sẽ hiển thị, chúng tôi bắt đầu ở vị trí 1 và kết thúc ở vị trí 22:
myline = numpy.linspace(1, 22, 100)
Vẽ biểu đồ phân tán ban đầu:
plt.scatter(x, y)
Vẽ đường hồi quy đa thức:
plt.plot(myline, mymodel(myline))
Hiển thị sơ đồ:
plt.show()
R-Bình phương
Điều quan trọng là phải biết mối quan hệ giữa các giá trị của trục x và y như thế nào, nếu không có mối quan hệ này thì 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ệ được đo bằng một giá trị được gọi là bình phương r.
Giá trị bình phương r nằm trong khoảng từ 0 đến 1, trong đó 0 có nghĩa là không có mối quan hệ và 1 có nghĩa là có liên quan 100%.
Python và mô-đun Sklearn sẽ tính toán giá trị này cho bạn, tất cả những gì bạn phải làm là nạp nó bằng các mảng x và y:
Thí dụ
Dữ liệu của tôi phù hợp như thế nào trong một hồi quy đa thức?
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)))
Lưu ý: Kết quả 0,94 cho thấy có một mối quan hệ rất tốt và chúng ta có thể sử dụng hồi quy đa thức trong các dự đoán trong 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 được để dự đoán các giá trị trong tương lai.
Ví dụ: Chúng ta hãy thử dự đoán tốc độ của một chiếc ô tô đi qua trạm thu phí vào khoảng 17 giờ chiều:
Để làm như vậy, chúng ta cần cùng một mymodel
mảng từ ví dụ trên:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Thí dụ
Dự đoán vận tốc của ô tô đi lúc 17 giờ chiều:
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)
Ví dụ dự đoán tốc độ là 88,87, chúng ta cũng có thể đọc được từ biểu đồ:
Phù hợp xấu?
Hãy để chúng tôi tạo một ví dụ trong đó hồi quy đa thức không phải là phương pháp tốt nhất để dự đoán các giá trị trong tương lai.
Thí dụ
Các giá trị này cho trục x và y sẽ dẫn đến sự phù hợp rất xấu cho hồi quy đa thức:
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ả:
Và giá trị bình phương r?
Thí dụ
Bạn sẽ nhận được giá trị bình phương r 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)))
Kết quả: 0,00995 chỉ ra mối quan hệ rất xấu và cho chúng ta biết rằng tập dữ liệu này không phù hợp với hồi quy đa thức.