Hồi quy logistic (logistic regression) là một mô hình thống kê, mô hình hoá biến phụ thuộc nhị phân. Về cơ bản, ý tưởng của hồi quy logistic là tìm mối quan hệ giữa các đặc trưng và xác suất của kết quả cụ thể (0 hoặc 1, đậu hoặc rớt,..)
Trong thực tế, hồi quy logistic không chỉ ứng dụng trong dự đoán nhãn mà còn dùng để dự đoán xác suất xảy ra của một vấn đề cụ thể. Trong dự báo thời tiết, hồi quy logistic không chỉ dự đoán một ngày trong tương lai có mưa hay không, mà còn dự đoán được xác suất xảy ra mưa. Tương tự, hồi quy logistic có thể được sử dụng để dự đoán khả năng bệnh nhân mắc một bệnh cụ thể với các triệu chứng nhất định, đó là lý do tại sao nó rất phổ biến trong lĩnh vực y học.
![]() |
|---|
| Mô hình hồi quy logistic |
Ảnh trên biểu diễn một mô hình hồi quy logistic cơ bản với:
Và nếu ai đã tìm hiểu về linear regression thì sẽ nhận ra sự khác biệt về activation function giữa linear regression và logistic regression là hàm Sigmoid
Cùng với activation function, loss function là một hàm quan trọng đối với một mô hình học máy.
Như vậy, ở bài viết này chúng ta sẽ cùng nhau phân tích về activation function và loss function của logistic regression.
Trước tiên hãy cùng nhau biểu diễn hàm sigmoid trên trục toạ độ
![]() |
|---|
| Hàm sigmoid |
Có thể thấy sigmoid nhận giá trị đầu vào $-\infty$ $\rightarrow$ $+\infty$ và cho ra output 0 $\rightarrow$ 1
![]() |
|---|
Như vậy, có thể thấy sigmoid là hàm trung gian biểu thị mối quan hệ tuyến tính giữa các đặc trưng $x$ và giá trị xác suất $p$ cần dự đoán.
![]() |
|---|
Hàm Sigmoid là một hàm nghịch đảo của logit. Logit là sự kết hợp giữa odd (tỉ lệ cược) và logarit cơ số e. Tương tự như xác suất, odd là một khái niệm trong thống kê thể hiện số lần thành công xảy ra so với số lần thất bại xảy ra. Mặc dù xác suất và tỷ lệ cược đều đo lường khả năng xảy ra điều gì đó, nhưng xác suất được dùng nhiều hơn trong thực tế vì nó dễ hiểu hơn đối với hầu hết chúng ta.
$\quad \quad \quad \quad \quad \quad \quad \quad \text{Odds:}$ $$\frac{p}{1-p} = \frac{\frac{C_{positive}}{n}}{\frac{C_{nagative}}{n}} = \frac{C_{positive}}{C_{nagative}}$$
$\quad \quad \quad \quad \quad \quad \quad \quad \text{Logit:}$$$\ln{\frac{p}{1-p}}$$
Hàm logit nhận giá trị đầu vào trong (0, 1) và biến đổi chúng thành các giá trị trên toàn bộ phạm vi số thực $(-\infty, +\infty)$, mà chúng ta có thể sử dụng để biểu thị mối quan hệ giữa sự kết hợp tuyến tính các feature $z = (w^T.x)$ và xác suất xảy ra $(p)$:
$$Logit(p(y = 1 |x)) = w^T.x$$ $$\Leftrightarrow \ln{\frac{p}{1-p}} = z$$ $$\Leftrightarrow \frac{p}{1 - p} = e^{z} $$ $$\Leftrightarrow p = e^z(1 - p) $$ $$\Leftrightarrow p = e^z - e^zp $$ $$\Leftrightarrow e^z = p + e^zp $$ $$\Leftrightarrow e^z = p(1 + e^z) $$ $$\Leftrightarrow p = \frac{e^z}{1 + e^z} = \frac{1}{e^{-z}(1 + e^z)} = \frac{1}{1 + e^{-z}}$$
Như vậy ta đặt $\phi{(z)} = \frac{1}{1 + e^{-z}}$ là activation function của Logistis regression. Có thể nói sigmoid xuất phát từ một khái niệm trong thống kê, nên việc sử dụng nó để ánh xạ từ $z = (w^T.x)$ đến xác suất là có cơ sở.
Nếu như MSE là phương pháp được sử dụng để ước tính các tham số trong logistic regression thì Logistic regression sử dụng maximun likelihood để ước tính tham số w.
$$L(w) = \prod_{ i \in \{y = 1\}} \phi{(z^{(i)})} \times \prod_{ i \in \{y = 0\}} 1 - \phi{(z^{(i)})} = \prod_i^n {\phi{(z^{(i)})}}^{y^{(i)}} \times (1 - \phi{(z^{(i)})}) ^{1 - y^{(i)}} $$ gọi là likelihood function
Trong thực thế, maximize logarit cơ số e của hàm này dễ dàng hơn.
log-likelihood function: $$l(w) = \log{L(w)} = \sum_{i = 1}^n [ y^{(i)}\log{({\phi{(z^{(i)})}})} + (1 - y^{(i)})\log{(1 - \phi{(z^{(i)})})}]$$
Bây giờ có thể sử dụng Gradient Descent để maximize log-likelihood function hay minimize nó khi viết dưới dạng cost function: $$J(W) = \sum_{i = 1}^n [- y^{(i)}\log{({\phi{(z^{(i)})}})} - (1 - y^{(i)})\log{(1 - \phi{(z^{(i)})})}]$$
Cost function một mẫu dữ liệu: $$j(w) = - y\log{({\phi{(z)}})} - (1 - y)\log{(1 - \phi{(z)})}$$
Để tính toán Gradient Descent của cost function, chúng ta cần tính đạo hàm riêng của hàm chi phí theo $w$:
$$\frac{\partial j(w)}{\partial w} = - \frac {\partial}{\partial w} [y\log{({\phi{(z)}})} + (1 - y)\log{(1 - \phi{(z)})}] $$
$$= -( y \frac{1}{\phi{(z)}} - (1 - y)\frac{1}{1 - \phi{(z)}}) \frac {\partial}{\partial w} \phi{(z)} (1)$$
Ta có: $$\frac {\partial}{\partial w} \phi{(z)}$$ $$= \frac {\partial}{\partial w} \frac{1}{1 + e^{-z}}$$
$$= \frac{e^{-z}}{(1 + e^{-z})^2}\frac {\partial}{\partial w}z$$ $$= \frac{1}{1 + e^{-z}}\frac{e^{-z}}{1 + e^{-z}} \frac{\partial}{\partial w}z$$
$$ = \phi(z) (1 - \frac{1}{1 + e^{-z}}) \frac{\partial}{\partial w}z $$ $$= \phi(z) (1 - \phi{(z)})x (2)$$
Thay (2) vào (1) ta được:
$$\frac{\partial j(w)}{\partial w} = -( y \frac{1}{\phi{(z)}} - (1 - y)\frac{1}{1 - \phi{(z)}}) \phi(z) (1 - \phi{(z)})x$$
$$= - [y(1 - \phi{z}) - (1 - y)\phi{(z)}]x $$ $$= (y - y \phi{(z)} -\phi{(z)} + y \phi{(z)})x $$
$$ = -(y - \phi{(z)})x$$
Từ đó suy ra đạo hàm riêng của toàn data set là:
$$\frac{\partial}{\partial W}J(W) = -\sum_{i = 1}^n (y^{(i)} - \phi{(z^{(i)})})x^{(i)} = \nabla{J(W)}$$
Sử dụng GD, chúng ta có thể update W theo cách đi ngược chiều Gradient,$ \nabla{J(W)}$, của cost function $J(W)$:
$$W = W + \bigtriangleup{W}$$ Với $\bigtriangleup{W} = - \eta \nabla{J(W)} = - \eta [-\sum_{i = 1}^n (y^{(i)} - \phi{(z^{(i)})})]$
$= \eta \sum_{i = 1}^n (y^{(i)} - \phi{(z^{(i)})})$
Sử dụng logistic regression trong scikit learn để hiện thực hoá một mô hình đơn giản
# Chuẩn bị dữ liệu
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X = X[(y == 0) | (y == 1)]
y = y[(y == 0) | (y == 1)]
# Chia dữ liệu thành tập train và tập test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
# Chuẩn hoá dữ liệu
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# Training
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=100.0, random_state=1, solver = 'lbfgs', multi_class = 'ovr')
lr.fit(X_train_std, y_train)
# Dự đoán xác suất nhãn của từng điểm dữ liệu (hàng)
lr.predict_proba(X_test_std[:3, :])
# Dự đoán nhãn thuộc lớp 0 hay 1ớp
lr.predict(X_test_std[:3, :])
print('Accuracy: %.3f' % lr.score(X_test_std, y_test))