Chapter 1 - Ep.1: LOGISTIC REGRESSION - hồi quy Logistic

LOGISTIC REGRESSION

1/ INTRO

    Chào mọi người, hôm nay chúng ta cùng nhau tìm hiểu về Logistic Regression nhé. 

    Trong bài trước, Linear Regression có thể đưa ra được một dự đoán cụ thể giá nhà từ dữ liệu bạn đưa vào thông qua quá trình training. Nhưng ở bài này, kết quả đầu ra của chúng ta không phải là một giá trị cụ thể nữa, mà dưới dạng xác suất (probability). Ví dụ: xác suất này mai trời mưa nếu biết trước các số liệu (mức gió, độ ẩm,...), xác suất bạn qua môn nếu biết được thời gian học một ngày 👦, ...

    Mặc dù tên của nó là Logistics Regression nhưng nó không hẳn là regression (hồi quy), hầu như nó được sử dụng nhiều hơn trong các bài toán classification (phân loại).

    Không như hồi quy tuyến tính, Logistic Regression dùng một hàm (gọi là hàm sigmoid) để trả về một giá trị xác suất để ánh xạ tới 2 hay nhiều lớp (class) rời rạc nhau.



2/ VÍ DỤ

    Cùng nhau vào ví dụ để tiếp cận dễ hơn nhé.

    Khảo sát trên 5000 sinh viên trường Đại học Công Nghệ Thông Tin - ĐHQGTPHCM về thời gian trung bình mỗi ngày dành cho việc học (bao gồm cả thời gian học ở trường). Thời gian học này ảnh hưởng như nào đến kết quả thi cuối kì của sinh viên?

số giờ học

kết quả thi

số giờ học

kết quả thi

số giờ học

kết quả thi

5

1

4

0

7

1

6.5

1

2

0

5.8

1

8

1

8.5

1

3

0


    Linear Regression cho phép chúng ta dự đoán các giá trị liên tục (giá nhà,...), cho nên, bài toán này sử dụng Linear Regression là không khả thi. Còn Logistic Regression cho phép dự đoán các giá trị rời rạc nhau (đậu/rớt). 

    Các giá trị trong bộ data trên được biểu diễn kiểu như sau: 
    Từ biểu đồ trên, ta thấy trong bài toán này có thể có rất nhiều nhiễu, ví dụ thằng học ít vẫn có thể thi đậu bình thường, hoặc thằng học nhiều vẫn có thể thi rớt được cho nên, việc sử dụng Linear Regression là không hề ổn chút nào (vì Linear khá nhạy cảm với nhiễu).



3/ HÀM SIGMOID


    Trong máy học, hàm sigmoid (còn gọi là hàm kích hoạt - activaton) sử dụng để ánh xạ dự đoán theo xác suất.

    Công thức: 
S(x) là đầu ra xác suất (0 hoặc 1)
                                                                       x là hàm nhập vào (ngưỡng để phân lớp)

    Đạo hàm của hàm Sigmoid:
                                   
                                                        S'(x) = S(x) * (1 - S(x))


    Tính chất:
                        * Hàm này bị giới hạn 2 đầu (từ 0 đến 1 - tức là 0 đến 100% á)
                        * Hàm này có đạo hàm tại mọi điểm.
                       * Lấy đường thẳng y = 1/2 làm "ranh giới" thì các điểm nằm trên y thì càng gần 1 (qua môn) và ngược lại.

    Vậy, cái ngưỡng mà chúng ta đang nói tới đây là gì ?

    Hàm Sigmoid trả về điểm xác suất trong khoảng 0-1, chúng là cần một ngưỡng để ánh xạ nó về giá trị phân loại 0 hoặc 1 (qua môn hoặc rớt). 
    Như trong hình minh họa trên, y = 0.5 là một ngưỡng, mọi giá trị xác suất hàm sigmoid tính ra nếu >= 0.5 là trả về 1 (qua môn) còn < 0.5 là trả về 0 (rớt).
    
    Xác định ngưỡng như thế nào? Chúng ta có công thức:

                             x = w1*x1 + w2*x2 + ... + w(n-1)*x(n-1) + w(n)
    
    Nhìn giống công thức của Linear Regression phải không? 
    Trong bài này, x = w1*(studytime) + w2.



4/ HÀM MẤT MÁT

    Logistic Regression là bài toán phi tuyến tính, cho nên chúng ta đừng sử dụng hàm tính Mean Square Error (MSE) như Linear Regression. Thay vì thế, chúng ta sử dụng một hàm mất mát khác có tên là Cross-Entropy.

    Công thức tổng quát trên toàn bộ dữ liệu:
                   (i = 1 đến N)
      L = (N) * (− (y_true[i] * log(y_pred[i]) + (1 - y_true[i]) * log(1 - y_pred[i])))


    Hàm này chia ra làm 2 trường hợp riêng biệt:

                + Với y_true = 0: 
-log(1 - \hat{y_i})
                + Với y_true = 1:
                                               L = - log(y_pred)



5/ CODE

B1: Tìm ngưỡng.

import pandas as pd
dataframe = pd.read_csv('data.csv')
dataframe


import sklearn 
X = dataframe[['TG học']]
Y = dataframe['Kết quả']

X = np.array(X)
Y = np.array(Y)
X = np.concatenate((np.ones((1, X.shape[1])), X), axis = 0)

def tim_nguong(Xyw_initetatol = 1e-4max_count = 10000):
    w = [w_init]    
    it = 0
    N = X.shape[1]
    d = X.shape[0]
    count = 0
    check_w_after = 20
    while count < max_count:
        # mix data 
        mix_id = np.random.permutation(N)
        for i in mix_id:
            xi = X[:, i].reshape(d, 1)
            yi = y[i]
            zi = sigmoid(np.dot(w[-1].T, xi))
            w_new = w[-1] + eta*(yi - zi)*xi
            count += 1
            # stopping criteria
            if count % check_w_after == 0:                
                if np.linalg.norm(w_new - w[-check_w_after]) < tol:
                    return w
            w.append(w_new)
    return w

import numpy as np
eta = 0.05 
d = X_train.shape[0]
w_init = np.random.randn(d, 1)
w = tim_nguong(X_train, Y_train, w_init, eta)

xx = np.linspace(0, 10, 5000) # thời gian học từ 0 - 10h, 5000 labels
w0 = w[-1][0][0]
w1 = w[-1][1][0]

B2: Đưa ngưỡng vào hàm sigmoid.

# đưa ngưỡng vào hàm sigmoid
y_pred = sigmoid(w0 + w1*xx)

B3: Tính hàm mất mát.

import math
sum = 0
for i in range(len(Y)):
  if Y[i] == 1:
    sum = sum + (-math.log(y_pred[i]))
  else:
    sum = sum + (-math.log(1 - y_pred[i]))

Cross_Entropy = sum/len(Y)
Cross_Entropy


- Kết quả hàm mất mát:

* Hồi quy logistic đa thức

    Ví dụ ở trên gọi là Hồi quy Logistic đơn thức, với các biến đầu ra là nhị phân. 
    
    Với Hồi quy Logistic đa thức, biến đầu ra có thể có nhiều hơn hai đầu ra rời rạc là 0 và 1. Có thể là tập dữ liệu số (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)....

import sklearn 
from sklearn.model_selection import train_test_split

# chia dữ liệu thành 2 tập train - test
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size = 0.2) # tỉ lệ: 80 train - 20 test

from sklearn.linear_model import LinearRegression 
lr = LogisticRegression()
lr.fit(X_train, Y_train)
Y_pred = logistic_regression.predict(X_test)

from sklearn.metrics import accuracy_score 
acc = accuracy_score(Y_test, Y_pred) 
print('ACCUARACY = ', acc)  # độ chính xác

    
    Chúng ta cũng có thể triển khai bài toán Hồi quy Logistic đơn thức như Hồi quy Logistic đa thức bình thường. Vì đa thức chẳng qua cũng là hợp lại của nhiều đơn thức thôi mà. 👦

__________________________________________________________________________



Mình xin kết thúc bài viết về Logistic Regression ở đây. 

 

Bài viết của mình chỉ giúp người đọc tiếp cận nhanh nhất với Hồi quy Logistic mà thôi. Các bạn muốn tìm hiểu chuyên sâu hơn có thể tìm hiểu thêm trên Google có nhiều trang viết rất hay và cụ thể hơn nữa. 

 

Mọi người không hiểu chỗ nào hay có đóng góp gì cứ bình luận ở dưới  mình sẽ giải đáp hoặc cùng nhau học tập nha. 

 

Cảm ơn mọi người rất nhiều...!  💚💙💛






Nhận xét