“Machine learning, những thuật toán cơ bản”

Phần 1 : Linear Regression và cách hoạt động của nó

       Đây là bài viết đầu tiên của mình trong chuỗi bài mà mình sẽ viết về “Machine learning, những thuật toán cơ bản”. Ở  bài viết lần này mình sẽ nói về cách hoạt động của thuật toán Linear Regression, những ứng dụng của nó, tại sao là Linear Regression chứ không phải thuật toán nào khác?
        Linear Regression hay cách “báo đài” hay nói là “hồi quy tuyến tính” là một trong những chủ đề nổi tiếng nhất trong thống kê và đặc biệt trong Machine Learning. Nổi tiếng đồng nghĩa rằng bài viết về nó là rất nhiều, có rất nhiều những bài viết rất chi tiết nhưng đôi khi lại mang đến sự “quá tải” cho người đọc, ở bài viết này mình sẽ viết ngắn gọn và dễ hiểu nhất cho người đọc.
        Trước khi đến với định nghĩa rõ ràng về Linear Regression chúng ta hãy nói về 1 ví dụ mà bạn rất hay gặp trong cuộc sống: Ta có ngôi nhà x1 có diện tích là y1 (m2) được bán với giá là s1(đ) và nếu chúng ta có số liệu thông kê của n ngôi nhà với diện tích và giá bán,giả sử rằng ngôi nhà với diện tích lớn thì sẽ được bán với giá cao hơn thì liệu khi có thêm 1 ngôi nhà mới với diện tích biết trước thì chúng ta có thể dự đoán được giá bán của nó không ?
        Từ ví dụ trên chúng ta cũng có thể hiểu sơ qua được 1 phần về Linear Regression. Hồi quy tuyến tính là 1 thuật toán trong Machine Learning cho phép chúng ta ánh xạ đầu vào số thành đầu ra số khớp một dòng điểm dữ liệu, bạn có thể nhìn hình bên dưới các điểm màu xanh là các tượng trưng cho các ngôi nhà với diện tích và giá bán được biết trước, điểm màu đỏ là điểm chúng ta cần dự đoán giá bán, để trực quan mình đã vẽ 1 đường thằng đi qua tất cả các điểm màu xanh từ đó ta có thể dễ dàng nhận thấy và dự đoán được giá bán của ngôi nhà mới tượng trưng là điểm màu đỏ.


         Nhưng thực tế đâu chỉ màu hồng như vậy :), chúng ta có một ngôi nhà mới với diện tích lớn hơn nhưng vẫn bán với giá thấp hơn có thể có do một vài lý do có thể ngôi nhà đó không ở "mặt đường" chả hạn :). Bạn có thể quan sát đồ thị ở hình dưới.Giả sử ta cũng kẻ một đường thẳng đi qua các điểm màu xanh nhưng tất nhiên lần này bạn không thể kẻ khớp như lần trước. Vậy làm sao ta tìm được giá bán ngôi nhà khi có một ngôi nhà mới thêm vào ?. Phần này mình sẽ giải thích ở dưới nhé :)


        Vậy sau tất cả những thứ mình đã nói ở trên thì chúng ta cần một khái niệm "chính thức" của Linear Regression. Hồi quy tuyến tính đơn giản là một phương pháp tuyến để "mô hình hóa" môi quan hệ giữa các biến "độc lập" và các biến "phụ thuộc" của bạn. Một khái niệm được mình dịch lại nghe có vẻ hơi hàn lâm nhỉ :), đơn giản mục tiêu của hồi quy tuyến tính là tạo ra một đường thẳng trong 2 chiều (mặt phẳng, siêu mặt phẳng với nhiều hơn 2 chiều) càng gần (hay được gọi là Fitting) với các điểm càng tốt. Vậy làm sao để tạo ra đường thẳng (mặt phẳng, siều mặt phẳng) đó ?
        Trước hết bạn đọc hãy làm quen với "Least square method" hay còn được gọi là "phương pháp bình phương tối thiểu". Theo Wiki : "phương pháp bình phương tối thiểu, còn gọi là bình phương nhỏ nhất hay bình phương trung bình tối thiểu, là một phương pháp tối ưu hóa để lựa chọn một đường khớp nhất cho một dải dữ liệu ứng với cực trị của tổng các sai số thống kê (error) giữa đường khớp và dữ liệu". Công thức và chứng minh cho phương pháp bình phương tối thiểu :
       Giả sử dữ liệu gồm các điểm (xiyi) với i = 1, 2,..., n. Chúng ta cần tìm một hàm số f thỏa mãn :
f(xi) ≈ yi
       Giả sử hàm f có thể thay đổi hình dạng, phụ thuộc vào một số tham số, pj với j = 1, 2,..., m.
f(x) = f(pjx)
       Nội dung của phương pháp là tìm giá trị của các tham số pj sao cho biểu thức sau đạt cực tiểu:
       Nội dung này giải thích tại sao tên của phương pháp là bình phương tối thiểu.
        Đôi khi thay vì tìm giá trị nhỏ nhất của tổng bình phương, người ta có thể tìm giá trị nhỏ nhất của bình phương trung bình:
Điều này dẫn đến tên gọi bình phương trung bình tối thiểu.

       Trước khi bắt đầu vào ví dụ thực tế thì mình cần các bạn làm quen một số khái niệm cơ bản trong Machine Learning như LossFunction, LearningRate, Epochs, Gradient Descent (tất nhiên phần này mình sẽ nói rõ ở các bài học tiếp theo)

       Xét X là một biến độc lập, Y là một biến phụ thuộc. Chúng ta sẽ định nghĩa mối quan hệ giữa X và Y như sau :
LOSS FUNCTION
       Ta có m và c là 2 giá trị cần tìm. Mục tiêu của chúng ta là giảm thiểu hàm Loss để đạt được giá 
trị tốt nhất của m và c. Chúng ta sẽ sử dụng phương trình Mean Squared Error (một tên gọi khác của
bình phương trung bình tối thiểu). Chúng ta sẽ thực hiện tối ưu hàm Loss theo 3 bước :

  1. Tìm sự khác nhau giữa giá trị thực tế  y và giá trị dự đoán y_pred (y = mX + c)
  2. Tính toán hiệu bình phương của y và y_pred
  3. Tính trung bình bình phương mỗi giá trị trong X

Trong đó yᵢ là giá trị thực tế và ȳᵢ là giá trị dự đoán. Phương trình trên trương đương với :
THE GRADIENT DESCENT ALGORITHM

Gradient Descent là một thuật toán tối ưu hóa vòng lặp để tìm giá trị nhỏ nhất của hàm Loss


Chúng ta sẽ thử áp dụng Gradient Descent để tìm m và c cho phương trình trên.
  1. Khởi tạo m = 0 và c = 0. Với L là Learning Rate để kiểm soát giá trị m thay đổi theo từng bước, L có thể là một giá trị nhỏ như 0.0001 nhưng cho độ chính xác tốt.
  2. Tính toán giá trị Dm và Dc là đạo hàm từng phần của hàm Loss với m và c.

       3. Chúng ta sẽ cập nhật giá trị m và c theo phương trình 2 phương trình sau :

        4. Chúng ta sẽ lặp lại các quá trình này khi hàm Loss không còn thay đổi hoặc thay đổi rất nhỏ.
Giá trị m và c còn lại sẽ là giá trị tối ưu.

        Oke, sau "rất nhiều" lý thuyết và công thức ở trên chúng ta cùng "bắt tay" là một ví dụ cơ bản về Linear Regression. Trước hết chúng ta cần 1 dataset (tập dữ liệu), tập dữ liệu này có sẵn trên Kaggle, bạn đọc có thể tải về tại đây.

        Đoạn code dưới đây để biểu diễn cho tập dataset trên, bạn đọc có thể tham khảo

# This Python 3 environment comes with many helpful analytics libraries installed# For example, here's several helpful packages to load in
#author : backtracking_
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

#Import Libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# np.set_printoptions(threshold=np.nan)
#Importing DataSet
dataset = pd.read_csv("../kc_house_data.csv")
space = dataset['sqft_living']
price = dataset['price']

x = np.array(space).reshape(-1, 1)
y = np.array(price)

#Splitting the data into Train and Test
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=1/3, random_state=0)

plt.plot(xtrain, ytrain, 'ro')
plt.show()

        Dưới đây là visualizing cho training dataset 
Sử dụng Loss Function và Gradient Descent để tìm đường thẳng tối ưu : 

import matplotlib.pyplot as plt

X = space / 100Y = price
# Building the model
m = 0
c = 0
L = 0.0001  # The learning Rate
epochs = 30  # The number of iterations to perform gradient descent
n = float(len(X))  # Number of elements in X
# Performing Gradient Descent
for i in range(epochs):
    Y_pred = m * X + c  # The current predicted value of Y    
    D_m = (-2 / n) * sum(X * (Y - Y_pred))  # Derivative wrt m    
    D_c = (-2 / n) * sum(Y - Y_pred)  # Derivative wrt c    
    m = m - L * D_m  # Update m    
    c = c - L * D_c  # Update c

Y_pred = m*X + c
plt.scatter(X, Y)
plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='blue') # regression lineplt.show()


Kết quả sau epochs thứ 30 khi đường thẳng không còn thay đổi nhiều nữa
Chúng ta sẽ kiểm chứng đường thẳng trên bằng công thức toán học 

ytrain = ytrain.T

ytrain = np.asarray([ytrain])
ytrain = ytrain.T

#Building Xbar
one = np.ones((xtrain.shape[0], 1))
Xbar = np.concatenate((one, xtrain), axis=1)

A = np.dot(Xbar.T, Xbar)
b = np.dot(Xbar.T, ytrain)
w = np.dot(np.linalg.pinv(A), b)

w_0 = w[0][0]
w_1 = w[1][0]
x0 = np.linspace(min(xtrain), max(xtrain), 2)
y0 = w_0 + w_1*x0

plt.plot(xtrain.T, ytrain.T, 'ro')
plt.plot(x0, y0)

plt.show()
Các bạn có thể so sánh kết quả giữa 2 Method của mình, kết quả trông có vẻ tương đối "ổn" chứ nhỉ :).
Còn phần testing mình sẽ không visualizing lên đây mà để làm bài tập cho các bạn, comment đáp án ở dưới nếu bạn đã làm xong nhé :)

Trong bài viết này mình đã nói về khái niệm Fitting trong Linear Regression cũng như ví dụ cơ bản về nó, những ưu điểm"có sẵn" của phương pháp này. Phần tiếp theo mình sẽ nói về hạn chế của nó và các phương pháp tối ưu, cách tránh OverFitting UnderFitting. Hẹn các bạn trong phần tiếp theo nhé :3

Các bạn có thể tham khảo thêm các bài các bài viết về Machine Learning của team mình tại đây. :3






Comments

Popular posts from this blog

YOLO: You Only Look Once

Giới thiệu về Generative Adversarial Networks (GANs)

Intersection over Union (IoU) cho object detection