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 Học máy 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 xuyên qua tất cả chúng.
Dòng này có thể được sử dụng để dự đoán các giá trị trong tương lai.
Trong Học máy, 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ẽ một đường hồi quy tuyến tính. 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ụ 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 chiếc ô tô khi chúng đi qua một 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 một hồi quy tuyến tính hay không:
Thí 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ả:
Thí 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ả:
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 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 đại diện cho 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ị chính 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 đại diện cho 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 như thế nào, nếu không có mối quan hệ 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á r
trị nằm trong khoảng từ -1 đến 1, trong đó 0 có nghĩa là không có mối quan hệ và 1 (và -1) có nghĩa là có 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.
Thí dụ
Dữ liệu của tôi phù hợp như thế nào trong một 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)
Lưu ý: Kết quả -0,76 cho thấy rằng có một mối quan hệ, không phải là hoàn hảo, nhưng nó chỉ ra rằng 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 năm tuổi.
Để làm như vậy, chúng ta cần myfunc()
hàm tương tự từ ví dụ trên:
def myfunc(x):
return slope * x + intercept
Thí dụ
Dự đoán vận tốc của một ô 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)
Ví dụ dự đoán tốc độ là 85,6, 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 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.
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 đối với 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ả:
Và r
cho mối quan hệ?
Thí dụ
Bạn sẽ nhận được một r
giá trị 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)
Kết quả: 0,013 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 tuyến tính.