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:
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()
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
Đăng nhận xét