Học máy - Hồi quy tuyến tính
hồi quy
Thuật ngữ hồi quy được sử dụng khi bạn cố gắng tìm mối quan hệ giữa các biến.
Trong Machine Learning và trong mô hình thống kê, mối quan hệ đó được sử dụng để dự đoán kết quả của các sự kiện trong tương lai.
Hồi quy tuyến tính
Hồi quy tuyến tính sử dụng mối quan hệ giữa các điểm dữ liệu để vẽ một đường thẳng đi qua tất cả chúng.
Đường này có thể được sử dụng để dự đoán các giá trị trong tương lai.
Trong Machine Learning, việc dự đoán tương lai là rất quan trọng.
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 tuyến tính. 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, trục x biểu thị độ tuổi và trục y biểu thị tốc độ. Chúng tôi đã đăng ký tuổi và tốc độ của 13 ô tô khi chúng đi qua trạm thu phí. Hãy để chúng tôi xem liệu dữ liệu chúng tôi thu thập có thể được sử dụng trong hồi quy tuyến tính hay không:
Ví dụ
Bắt đầu bằng cách vẽ một biểu đồ phân tán:
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
Kết quả:
Chạy ví dụ »Ví dụ
Nhập scipy
và vẽ đường hồi quy tuyến tính:
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
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 Matplotlib trong Hướng dẫn Matplotlib 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 matplotlib.pyplot as plt
from scipy import stats
Tạo các mảng biểu thị các giá trị của trục x và y:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
Thực thi một phương thức trả về một số giá trị khóa quan trọng của Hồi quy tuyến tính:
slope, intercept, r, p, std_err = stats.linregress(x, y)
Tạo một hàm sử dụng các giá trị slope
và intercept
để trả về một giá trị mới. Giá trị mới này biểu thị vị trí trên trục y, giá trị x tương ứng sẽ được đặt:
def myfunc(x):
return slope * x + intercept
Chạy từng giá trị của mảng x thông qua hàm. Điều này sẽ dẫn đến một mảng mới với các giá trị mới cho trục y:
mymodel = list(map(myfunc, x))
Vẽ biểu đồ phân tán ban đầu:
plt.scatter(x, y)
Vẽ đường hồi quy tuyến tính:
plt.plot(x, mymodel)
Hiển thị sơ đồ:
plt.show()
R cho mối quan hệ
Đ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à các giá trị của trục y là như thế nào, nếu không có mối quan hệ nào thì hồi quy tuyến tính không thể được sử dụng để dự đoán bất cứ điều gì.
Mối quan hệ này - hệ số tương quan - được gọi là r
.
Giá trị r
nằm trong khoảng từ -1 đến 1, trong đó 0 có nghĩa là không có mối quan hệ nào và 1 (và -1) có nghĩa là liên quan 100%.
Python và mô-đun Scipy 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 cho nó các giá trị x và y.
Ví dụ
Dữ liệu của tôi phù hợp như thế nào với hồi quy tuyến tính?
from scipy import stats
x =
[5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Hãy tự mình thử »Lưu ý: Kết quả -0,76 cho thấy có mối quan hệ, không hoàn hảo nhưng nó cho thấy chúng ta có thể sử dụng hồi quy tuyến tính 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ô 10 tuổi.
Để làm như vậy, chúng ta cần hàm myfunc()
tương tự như ví dụ trên:
def myfunc(x):
return slope * x + intercept
Ví dụ
Dự đoán vận tốc của ô tô 10 tuổi:
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
Chạy ví dụ »Ví dụ này dự đoán tốc độ là 85,6, 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 tuyến tính 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ẽ rất phù hợp cho hồi quy tuyến tính:
import matplotlib.pyplot as plt
from scipy import stats
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]
slope,
intercept, r, p, std_err = stats.linregress(x, y)
def
myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc,
x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Kết quả:
Chạy ví dụ » Và r
cho mối quan hệ?
Ví dụ
Bạn sẽ nhận được giá trị r
rất thấp.
import numpy
from scipy import stats
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]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Hãy tự mình thử »Kết quả: 0,013 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 tuyến tính.