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 không phù hợp với hồi quy tuyến tính (một đường thẳng đi qua tất cả các điểm dữ liệu), thì đó 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 ra 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ẽ đường hồi quy đa thức. Chúng tôi sẽ hướng dẫn bạn cách sử dụng các phương pháp này thay vì xem qua công thức toán học.
Trong ví dụ bên dưới, chúng tôi đã đăng ký 18 ô 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 việc vượt qua.
Trục x biểu thị số giờ trong ngày và trục y biểu thị tốc độ:
Ví 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ả:
Chạy ví dụ »Ví dụ
Nhập numpy
và matplotlib
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ụ »Ví dụ giải thích
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 biểu thị 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ô hình đa thức:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Sau đó chỉ định dòng sẽ hiển thị như thế nào, chúng ta 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()
bình phương R
Đ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 tốt đến mức nào, nếu không có mối quan hệ nào 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ị gọi là r bình phương.
Giá trị r bình phương nằm trong khoảng từ 0 đến 1, trong đó 0 nghĩa là không có mối quan hệ và 1 nghĩa là 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à cung cấp nó bằng mảng x và y:
Ví dụ
Dữ liệu của tôi phù hợp như thế nào trong 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)))
Hãy thử nếu chính bạn »Lưu ý: Kết quả 0,94 cho thấy có 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 ô tô đi qua trạm thu phí vào khoảng thời gian 17:00:
Để làm như vậy, chúng ta cần mảng mymodel
giống như ví dụ trên:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Ví dụ
Dự đoán vận tốc ô tô đi qua lúc 17h:
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ụ »Ví dụ này dự đoán tốc độ là 88,87, chúng ta cũng có thể đọc được tốc độ này từ biểu đồ:
Không phù hợp?
Chúng ta hãy tạo một ví dụ trong đó hồi quy đa thức sẽ không phải là phương pháp tốt nhất để dự đoán các giá trị trong tương lai.
Ví dụ
Các giá trị này cho trục x và trục y sẽ dẫn đến kết quả rất không phù hợp 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ả:
Chạy ví dụ »Và giá trị r bình phương?
Ví dụ
Bạn sẽ nhận được giá trị r bình phương 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)))
Hãy thử nếu chính bạn »Kết quả: 0,00995 cho thấy 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 cho hồi quy đa thức.