Bài 6: Giới thiệu về hồi quy logistic 


Khi chúng ta muốn hiểu mối quan hệ giữa một hoặc nhiều biến dự báo và một biến phản hồi là một biến liên tục, chúng ta thường sử dụng hồi quy tuyến tính .

Tuy nhiên, khi biến phản hồi là biến phân lớp/loại, chúng ta có thể sử dụng hồi quy logistic

Hồi quy logistic là một loại thuật toán phân lớp vì nó cố gắng "phân lớp" các quan sát từ một tập dữ liệu thành các lớp riêng biệt.

Dưới đây là một số trường hợp,  chúng ta có thể sử dụng hồi quy logistic:

  • Chúng ta muốn sử  dụng điểm tín dụng và  số dư ngân hàng để dự đoán liệu một khách hàng nhất định có vỡ nợ hay không. (Biến phản hồi = “Có” hoặc “Không có”)
  • Chúng ta muốn sử dụng số lần bật nhảy trung bình mỗi trận  và  điểm trung bình ghi được mỗi trận để dự đoán liệu một cầu thủ bóng rổ nhất định có được dự giải NBA hay không (Biến phản hồi = “Có” hoặc “Không”)
  • Chúng ta muốn sử dụng  diện tích và  số lượng phòng tắm để dự đoán xem một ngôi nhà ở một thành phố nhất định có được niêm yết với giá bán từ $200k trở lên hay không. (Biến phản hồi = “Có” hoặc “Không”)

Lưu ý rằng biến phản hồi trong các ví dụ này chỉ có thể nhận một trong hai giá trị. Đối lập điều này với hồi quy tuyến tính trong đó biến phản hồi nhận một số giá trị liên tục.

Hồi quy logistic  phù hợp với mô hình hồi quy khi biến phản hồi là giá trị nhị phân (biến chỉ có 2 trạng thái)

Phương trình hồi quy logistic

Hồi quy logistic sử dụng một phương pháp được gọi là ước tính khả năng xảy ra tối đa, để xây dựng phương trình có dạng sau:

log [p (X) / (1-p (X))] = β 0 + β 1 X 1 + β 2 X 2 +… + β p X p

ở đây:

  • Xj : Biến dự báo thứ  j
  • βj : Ước lượng hệ số cho biến dự báo thứ j

Do đó, chúng ta có thể sử dụng phương trình sau để tính xác suất mà một quan sát nhất định nhận giá trị 1:

p (X) = e β 0 + β 1 X 1 + β 2 X 2 +… + β p X p / (1 + e β 0 + β 1 X 1 + β 2 X 2 +… + β p X p )

Sau đó, chúng ta sử dụng một số ngưỡng xác suất để phân loại quan sát là 1 hoặc 0.

Chẳng hạn, chúng ta có thể nói rằng các quan sát có xác suất lớn hơn hoặc bằng 0,5 sẽ được phân lớp là “1” và tất cả các quan sát khác sẽ được phân lớp là “0”.

Giải thích một số tham số của hồi quy logistic

Như ở ví dụ trên, giả sử chúng ta sử dụng mô hình hồi quy logistic để dự đoán liệu một cầu thủ bóng rổ có được đưa thi đấu cho giải NBA hay không dựa trên số lần bật nhảy trung bình mỗi trận và điểm trung bình mỗi trận của họ.

Đây là đầu ra cho mô hình hồi quy logistic:

Diễn giải đầu ra hồi quy logistic

Bằng cách sử dụng các hệ số, chúng ta có thể tính xác suất một cầu sẽ được đưa thi đấu ở giải NBA dựa trên số lần bật nhảy trung bình và số điểm mỗi trận của họ bằng công thức sau:

Giả sử một cầu thủ có trung bình 8 rebounds mỗi trận và 15 điểm mỗi trận. Theo mô hình, xác suất để cầu thủ này được chọn vào NBA là  0,557.

P (Drafted) = e -2,8690 + 0,0698 * (8) + 0,1694 * (15) / (1 + e -2,8690 + 0,0698 * (8) + 0,1694 * (15) ) =  0,557

Vì xác suất này lớn hơn 0,5, nên chúng ta dự đoán rằng câu thủ này sẽ được cho giải NBA.

Ngược lại, với một cầu thủ chỉ có trung bình 3 rebounds và 7 điểm mỗi trận. Xác suất để cầu thủ này được chọn vào NBA là  0,186 .

P (Drafted) = e -2,8690 + 0,0698 * (3) + 0,1694 * (7) / (1 + e -2,8690 + 0,0698 * (3) + 0,1694 * (7) ) =  0,186

Vì xác suất này nhỏ hơn 0,5, chúng ta dự đoán rằng người chơi này sẽ không được tham dự NBA.

Hồi quy logistic với Python

Đầu tiên, chúng ta sẽ import các gói cần thiết để thực hiện hồi quy logistic trong Python:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import matplotlib.pyplot as plt

Bước 2: Tải dữ liệu

#import dataset from CSV file on Github
url = "https://raw.githubusercontent.com/Statology/Python-Guides/main/default.csv"
data = pd.read_csv(url)

#view first six rows of dataset
data[0:6]

        default	student	balance	        income
0	0	0	729.526495	44361.625074
1	0	1	817.180407	12106.134700
2	0	0	1073.549164	31767.138947
3	0	0	529.250605	35704.493935
4	0	0	785.655883	38463.495879
5	0	1	919.588530	7491.558572  

#find total observations in dataset
len(data.index)

10000

Tập dữ liệu này chứa thông tin về 10.000 cá nhân:

  • default: Cho biết một cá nhân được xem là mặc định hay không.
  • student: Cho biết một cá nhân có phải là học sinh hay không.
  • balance: Số dư trung bình của một cá nhân.
  • income: Thu nhập của cá nhân.

Chúng ta sẽ sử dụng tình trạng của sinh viên, số dư ngân hàng và thu nhập (status, bank balance, and income) để xây dựng mô hình hồi quy logistic nhằm dự đoán xác suất cho một cá nhân.

Bước 3: Tạo mẫu thử nghiệm và huấn luyện mô hình

Tiếp theo, chúng ta sẽ chia tập dữ liệu thành tập huấn luyện để  huấn luyện mô hình và tập thử nghiệm để  kiểm tra mô hình.

#define the predictor variables and the response variable
X = data[['student', 'balance', 'income']]
y = data['default']

#split the dataset into training (70%) and testing (30%) sets
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)  

Bước 4: Điều chỉnh mô hình hồi quy logistic

Tiếp theo, chúng ta sẽ sử dụng hàm LogisticRegression() để điều chỉnh mô hình hồi quy logistic với tập dữ liệu:

#instantiate the model
log_regression = LogisticRegression()

#fit the model using the training data
log_regression.fit(X_train,y_train)

#use model to make predictions on test data
y_pred = log_regression.predict(X_test)

Bước 5: Chẩn đoán mô hình

Khi có mô hình hồi quy, chúng ta có thể phân tích mô hình của chúng ta hoạt động tốt như thế nào trên tập dữ liệu thử nghiệm.

Đầu tiên, chúng ta sẽ tạo ma trận lỗi (confusion matrix) cho mô hình:

cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
cnf_matrix

array([[2886,    1],
       [ 113,    0]])

Từ ma trận lỗi, chúng ta có thể thấy rằng:

  • #True dự đoán dương: 2886
  • #True Dự đoán âm : 0
  • #False dự đoán dương: 113
  • #False dự đoán âm: 1

Chúng ta cũng có thể thu được độ chính xác của mô hình, từ đó cho chúng ta biết tỷ lệ phần trăm các dự đoán hiệu chỉnh mà mô hình đã thực hiện:

print("Accuracy:",metrics.accuracy_score(y_test, y_pred))l

Accuracy: 0.962

Điều này cho chúng ta biết rằng mô hình đã đưa ra dự đoán chính xác về việc một cá nhân có mặc định (default) 96,2% thời gian hay không.

Cuối cùng, chúng ta có thể vẽ đồ thị ROC (Receiver Operating Characteristic) hiển thị tỷ lệ phần trăm  được mô hình dự đoán là dương thực sự, khi giới hạn xác suất dự đoán được giảm từ 1 xuống 0.

AUC (diện tích dưới đường cong) càng cao, mô hình của chúng ta có khả năng dự đoán kết quả càng chính xác:

#define metrics
y_pred_proba = log_regression.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test,  y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)

#create ROC curve
plt.plot(fpr,tpr,label="AUC="+str(auc))
plt.legend(loc=4)
plt.show()

ROC curve in Python

Có thể tìm thấy mã Python hoàn chỉnh được sử dụng trong bài này tại: https://github.com/Statology/Python-Guides/blob/main/logistic_regression.py


Nhận xét

Bài đăng phổ biến từ blog này

AI chatbot hỗ trợ cho GV lên kế hoạch dạy học STEAM theo quy trinh 5E (GV mầm non và GV Tiểu học)

Mô hình IRT 3PL

Trang blog của Nguyễn Thế Dũng - ĐHSP Huế. Mời đọc.