Khoa học dữ liệu đang ở thời kỳ đỉnh cao, việc sử dụng các mô hình học máy giúp chúng ta có thể làm được rất nhiều thứ, từ việc làm phim đến tạo ra một bức tranh giả về nàng Mona Lisa nổi tiếng (oh, đó là một bí mật). Hồi quy tuyến tính là một trong những thuật toán học máy dễ thực hiện nhất. Chúng ta sẽ bàn về thuật toán này trong bài viết.
Hiểu 1 cách đơn giản thì Machine learning ...
Bạn có đầu vào x (x có thể là 1 bức ảnh, âm thanh, hoặc 1 biến, ...) . Từ x bạn cần dự đoán ra 1 kết quả mình gọi là y (Ví dụ với x là 1 bức ảnh bạn cần dự đoán xem ảnh này có phải ảnh con chó không?)
Bạn cần sưu tầm rất nhiều ảnh để dạy cho cái máy tính hiểu đâu là ảnh con chó. Bản chất việc dạy này là đi tìm 1 phương trình để với mỗi đầu vào x ta có 1 đầu ra y. Mình ví dụ phương trình này nó rất đơn giản chỉ là phương trình đường thẳng hồi cấp 3 ai cũng học y = ax + b
vậy 1 phương trình đường thẳng xác định bởi điều gì ?. chắc chắn là a
và b
rồi. Vậy việc HỌC ở đây có nghĩa là dùng đống dữ liệu để dò ra giá trị a
và b
còn chi tiết dò ra như nào thì chúng ta cùng xem thuật toán bên dưới nhé.
Hồi quy tuyến tính là gì?
Hồi quy tuyến tính là một phương pháp được sử dụng để xác định mối quan hệ giữa một biến đầu vào (X) và biến đầu ra (Y). Có thể viết đơn giản như sau:
Trong đó, y là biến phụ thuộc (gọi là phụ thuộc vì nó phụ thuộc vào giá trị của biến khác trong trường hợp này là biến x), m là hệ số tỷ lệ hoặc hệ số góc(trong phương trình đường thẳng nó còn gọi là hệ số góc), b là hệ số điều chỉnh (tạm gọi là điều chỉnh vì chúng ta điều chỉnh nó để mô hình của chúng ta linh hoạt hơn bạn thử tưởng tượng ta thay đổi hệ số b của phương trình đường thẳng thì đường thẳng đó cũng bị thay đổi) (bias coeficient) và X là biến độc lập (độc lập vì không phụ thuộc vào biến khác). Chúng ta cần b với mục đích chính là để vẽ đường thẳng dự đoán mối quan hệ giữa X và Y một cách chính xác nhất.
Nhưng làm thế nào để chúng ta tìm ra những hệ số này. Thực tế, có rất nhiều phương pháp tiếp cận khác nhau, một trong số đó là phương pháp Bình phương nhỏ nhất (Ordinary Least Mean Square) và phương pháp Gradient Decent. Trong bài biết này, chúng ta sẽ cài đặt phương pháp Bình phương nhỏ nhất.
Bình phương nhỏ nhất (Ordinary Least Mean Square)
Trước đó chúng ta đã thảo luận về ước lượng mối quan hệ giữa X và Y biểu diễn bằng một đường thẳng. Ví dụ: chúng ta có các mẫu dữ liệu vào và dữ liệu ra, sau đó biểu diễn các điểm phân tán này trên biểu đồ 2 chiều như hình vẽ dưới đây.
Đường màu đỏ nhìn thấy trong biểu đồ chính là kết quả mà chúng ta cần đạt được. Đường này thể hiện được điều dữ liệu muốn nói bạn. Có thể thấy dữ liệu có su hướng tạo thành đường thẳng và đường màu đỏ thể hiện được chính xác nhất dữ liệu - Sai số của từng điểm dữ liệu so với mô hình chính là khoảng cách từ mỗi điểm đến đường thẳng, như hình minh họa bên dưới.
Sai số của mô hình tuyến tính chính là tổng sai số của tất cả các điểm.
Trong đó ri
là khoảng cách giữa đường thẳng và điểm thứ i
n
là tổng số điểm
Chúng ta bình phương từng khoảng cách(r
) bởi vì có một số điểm nằm trên, một số điểm nằm dưới đường thẳng. Có thể giảm thiểu sai số của mô hình tuyến tính bằng cách giảm thiểu r, ta có:
Trong đó [imath]\overline{x}[/imath] là giá trị trung bình của biến đầu vào X
[imath]\overline{y}[/imath] là giá trị trung bình của biến đầu ra Y
Để ý một tý thì các bạn sẽ thấy phần tử số của công thức ở trên chính là công thức tính khoảng cách của 2 điểm. Trong hệ trục toạ độ mà chúng ta đã học ở trung học. Khoảng cách của điểm xi
với [imath]\overline{x}[/imath] (x trung bình). tại sao lại là x trung bình ? Vì chúng ta đang có rất nhiều điểm dữ liệu mà để vẽ được 1 đường thẳng thì chúng ta cần có 2 điểm nên tạm thời chúng ta lấy 1 điểm là điểm trung bình của tập dữ liệu (điểm trung bình cũng là điểm thể hiện được phần nào dữ liệu).
Phương trình y = mx + b
mà biết 2 điểm thì bạn giải hệ phương trình biến đổi xíu là chúng ta có công thức ở ảnh trên đúng không ? Tại sao mình nói là chúng ta biết ít nhất là 2 điểm rồi . Vì thường những bài toán học có giám sát. Chúng ta thường có Dữ liệu - Nhãn
phải có dữ liệu
và nhãn(kết quả)
thì mới dạy cho cái máy học được đúng không? Dữ liệu ở đây là x
và nhãn chính là y
. Điểm thứ 1 chính là điểm trung bình của dữ liệu chúng ta có. Điểm thứ 2 tạm thời lấy bất kỳ điểm nào trong đống dữ liệu cho trước của chúng ta (tạm thời lấy tạm 1 điểm để hiểu ý tưởng thôi tý nữa chúng ta sẽ cộng
tổng của tất cả các điểm lại để nó có thể mô tả lại cả tập dữ liệu). Thế là chúng ta lập ngay được hệ phương trình
y_tb = m*x_tb + b
yi = m*xi + b
m
chính là cái Bi
còn b
chính là cái B0
nhé. Đây trong công thức này này nhắc lại lần nữa k lại quên
Dài dòng nãy giờ chỉ đơn giản là chúng ta tính và tìm ra được hệ số m
và b
thôi
Bây giờ ta cài đặt phương pháp này bằng Python (phần thú vị trong bài viết này)
Để tiếp tục, bạn cần có python. Sử dụng pip để cài đặt các phụ thuộc (dependencies).
Ở đây chúng ta sẽ sử dụng tập dữ liệu gồm kích thước đầu và trọng lượng não của những người khác nhau. Bạn có thể tải tập dữ liệu đó tại đây
Chúng ta bắt đầu bằng việc import tập dữ liệu và các thư viện
#import libraries
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pddataset = pd.read_csv('dataset.csv')
print(dataset.shape)
dataset.head()
(237, 4)
Tiếp tục, tìm kiếm mối liên hệ giữa kích thước đầu và trọng lượng não
# initializing our inputs and outputs
X = dataset['Head Size(cm^3)'].values
Y = dataset['Brain Weight(grams)'].values
# giá trị trung bình của inputs và outputs
x_mean = np.mean(X)
y_mean = np.mean(Y)
#tổng số giá trị
n = len(X)
# sử dụng công thức để tính b1 và b0
numerator = 0
denominator = 0
for i in range(n):
numerator += (X[i] - x_mean) * (Y[i] - y_mean)
denominator += (X[i] - x_mean) ** 2
b1 = numerator / denominator
b0 = y_mean - (b1 * x_mean)
#in ra giá trị các hệ số
print(b1, b0)
#b1 chinh la m
# output : 0.26342933948939945 325.57342104944223
Giờ chúng ta hệ số điều chỉnh (b) và hệ số tỷ lệ (m). Về mặt toán học:
Brain weights = 325.57342104944223 + 0.26342933948939945 * Head size
Giờ ta đã có một mô hình tuyến tính.
Hãy vẽ nó ra nào.
#vẽ các giá trị
x_max = np.max(X) + 100
x_min = np.min(X) – 100
#tính toán các giá trị đường thẳng của x và y
x = np.linspace(x_min, x_max, 1000)
y = b0 + b1 * x
#vẽ đường thẳng
plt.plot(x, y, color='#00ff00', label='Linear Regression')
#vẽ các điểm dữ liệu
plt.scatter(X, Y, color='#ff0000', label='Data Point')
# tên trục x
plt.xlabel('Head Size (cm^3)')
#tên trục y
plt.ylabel('Brain Weight (grams)')
plt.legend()
plt.show()
Chúng ta cần đánh giá mức độ chính xác của mô hình. Có rất nhiều cách để đánh giá, ở đây chúng ta sẽ áp dụng Sai số bình phương gốc (Root mean squared error) và Hệ số xác định (R2).
Sai số bình phương gốc là căn bậc hai của tổng tất cả các sai số chia cho tổng số giá trị, công thức tính như sau:
Trong đó yj^ là giá trị đầu ra dự đoán thứ i. Bây giờ chúng ta sẽ tính toán RMSE.
rmse = 0
for i in range(n):
y_pred= b0 + b1* X[i]
rmse += (Y[i] - y_pred) ** 2
rmse = np.sqrt(rmse/n)
print(rmse)
#output : 72.1206213783709
Tiếp theo ta xác định giá trị R2 để có thể đánh giá được độ chính xác của mô hình tuyến tính.
SST là tổng bình phương và SSR là tổng bình phương của các phần dư.
Giá trị của R2 thường nằm trong khoảng từ 0 đến 1, và cũng có thể là số âm nếu mô hình chúng ta lập ra sai hoàn toàn. Bây giờ chúng ta sẽ tính R2:
sumofsquares = 0
sumofresiduals = 0
for i in range(n) :
y_pred = b0 + b1 * X[i]
sumofsquares += (Y[i] - y_mean) ** 2
sumofresiduals += (Y[i] - y_pred) **2
score = 1 - (sumofresiduals/sumofsquares)
print(score)
#output : 0.6393117199570003
0.63 là một con số không tệ, tuy nhiên chúng ta có thể cải thiện nó bằng cách
- nhận thêm bộ dữ liệu
- cải thiện các tính năng
- điều chỉnh nhiều mô hình
Video tiếng việt để bạn hiểu thêm
https://youtu.be/_x1ncKk8rgc
Kết luận
Hồi quy tuyến tính là cơ sở của tất cả các thuật toán học máy và là thuật toán dễ hiểu nhất, chúng ta đã cài đặt phương pháp Bình phương nhỏ nhất để dự đoán trọng lượng não từ kích thước đầu và tính độ chính xác bằng Sai số bình phương trung bình gốc và Hệ số xác định (R2).
Bạn có thể tìm thấy mã nguồn tại đây.