Các kỹ thuật phân loại là một phần thiết yếu của các ứng dụng học máy và khai phá dữ liệu. Xấp xỉ 70% bài toán khoa học dữ liệu là bài toán phân loại. Có rất nhiều bài toán phân loại, nhưng hồi quy logistic là phương pháp phổ biến và hữu ích để giải quyết bài toán phân loại nhị phân. Một loại phân loại khác là phân loại đa thức (Multinomial), xử lý các trường hợp có nhiều lớp trong biến mục tiêu. Ví dụ, bộ dữ liệu IRIS là ví dụ rất nổi tiếng về phân loại đa lớp. Các ví dụ khác là phân loại danh mục bài viết/blog/tài liệu.
Hồi quy logistic có thể được dùng cho nhiều bài toán phân loại, chẳng hạn phát hiện thư rác. Một số ví dụ khác gồm: dự đoán tiểu đường, liệu một khách hàng sẽ mua một sản phẩm cụ thể; khách hàng có rời bỏ hay không, người dùng có nhấp vào một liên kết quảng cáo nhất định hay không, và còn nhiều nữa.
Hồi quy Logistic là một trong những thuật toán Học máy đơn giản và được dùng phổ biến nhất cho phân loại hai lớp. Nó dễ triển khai và có thể dùng làm đường cơ sở cho bất kỳ bài toán phân loại nhị phân nào. Các khái niệm nền tảng của nó cũng hữu ích trong học sâu. Hồi quy logistic mô tả và ước lượng mối quan hệ giữa một biến phụ thuộc nhị phân và các biến độc lập.
Để tự chạy dễ dàng toàn bộ mã ví dụ trong hướng dẫn này, bạn có thể tạo một sổ tay DataLab miễn phí với Python được cài sẵn và chứa mọi mẫu mã. Để luyện tập thêm về hồi quy logistic, hãy xem các bài tập trong khóa học Mô hình hóa Rủi ro Tín dụng bằng R, với rất nhiều ví dụ thực tế.
Hồi quy Logistic là gì?
Hồi quy logistic là một phương pháp thống kê để dự đoán các lớp nhị phân. Kết quả hoặc biến mục tiêu có tính chất lưỡng phân. Lưỡng phân nghĩa là chỉ có hai lớp khả dĩ. Ví dụ, có thể dùng cho bài toán phát hiện ung thư. Nó tính xác suất xảy ra của một sự kiện.
Đây là một trường hợp đặc biệt của hồi quy tuyến tính, trong đó biến mục tiêu có tính phân loại. Nó sử dụng log tỉ số khả dĩ (log-odds) làm biến phụ thuộc. Hồi quy Logistic dự đoán xác suất xảy ra của một sự kiện nhị phân bằng cách sử dụng hàm logit.
Phương trình Hồi quy Tuyến tính:
![]()
Trong đó y là biến phụ thuộc và x1, x2 ... và Xn là các biến giải thích.
Hàm Sigmoid:

Áp dụng hàm Sigmoid lên hồi quy tuyến tính:

Các tính chất của Hồi quy Logistic:
- Biến phụ thuộc trong hồi quy logistic tuân theo Phân phối Bernoulli.
- Ước lượng được thực hiện bằng phương pháp hợp lý cực đại (maximum likelihood).
- Không có R Square; độ phù hợp mô hình được tính qua Concordance, thống kê KS.
Hồi quy Tuyến tính so với Hồi quy Logistic
Hồi quy tuyến tính cho đầu ra liên tục, còn hồi quy logistic cho đầu ra rời rạc. Ví dụ về đầu ra liên tục là giá nhà và giá cổ phiếu. Ví dụ về đầu ra rời rạc là dự đoán bệnh nhân có ung thư hay không và dự đoán khách hàng có rời bỏ hay không. Hồi quy logistic được ước lượng bằng phương pháp hợp lý cực đại (MLE), trong khi hồi quy tuyến tính thường được ước lượng bằng bình phương tối thiểu thông thường (OLS), vốn cũng có thể coi là trường hợp đặc biệt của MLE khi sai số trong mô hình có phân phối chuẩn.

Hợp lý cực đại so với Phương pháp Bình phương Tối thiểu
MLE là phương pháp tối đa hóa "hàm hợp lý", trong khi OLS là phương pháp xấp xỉ tối thiểu hóa khoảng cách. Tối đa hóa hàm hợp lý xác định các tham số có khả năng nhất tạo ra dữ liệu quan sát được. Về mặt thống kê, MLE đặt trung bình và phương sai làm tham số trong việc xác định các giá trị tham số cụ thể cho một mô hình cho trước. Bộ tham số này có thể dùng để dự đoán dữ liệu cần thiết trong phân phối chuẩn.
Ước lượng Bình phương Tối thiểu thông thường được tính bằng cách khớp một đường hồi quy lên các điểm dữ liệu sao cho tổng bình phương độ lệch là nhỏ nhất (lỗi bình phương tối thiểu). Cả hai đều được dùng để ước lượng tham số của mô hình hồi quy tuyến tính. MLE giả định một hàm khối xác suất chung, trong khi OLS không đòi hỏi giả định ngẫu nhiên nào để tối thiểu hóa khoảng cách.
Hàm sigmoid
Hàm sigmoid, còn gọi là hàm logistic, cho một đường cong hình chữ S có thể nhận bất kỳ số thực nào và ánh xạ thành giá trị giữa 0 và 1. Nếu đường cong tiến tới dương vô cùng, y dự đoán sẽ thành 1, và nếu đường cong tiến tới âm vô cùng, y dự đoán sẽ thành 0. Nếu đầu ra của hàm sigmoid lớn hơn 0,5, ta có thể phân loại kết quả là 1 hoặc CÓ, và nếu nhỏ hơn 0,5, ta phân loại là 0 hoặc KHÔNG. Ví dụ, nếu đầu ra là 0,75, ta có thể nói theo xác suất rằng có 75% khả năng bệnh nhân mắc ung thư.


Các loại Hồi quy Logistic
Các loại Hồi quy Logistic:
- Hồi quy Logistic Nhị phân: Biến mục tiêu chỉ có hai kết quả khả dĩ như Spam hoặc Không Spam, Có Ung thư hoặc Không.
- Hồi quy Logistic Đa thức: Biến mục tiêu có ba hoặc nhiều hạng mục danh nghĩa, chẳng hạn dự đoán loại Rượu.
- Hồi quy Logistic Thứ bậc: Biến mục tiêu có ba hoặc nhiều hạng mục có thứ tự, như xếp hạng nhà hàng hoặc sản phẩm từ 1 đến 5.
Xây dựng mô hình trong Scikit-learn
Hãy xây dựng mô hình dự đoán tiểu đường sử dụng bộ phân loại hồi quy logistic.
Trước tiên, hãy tải bộ dữ liệu Pima Indian Diabetes cần thiết bằng hàm đọc CSV của pandas. Bạn có thể tải dữ liệu từ liên kết sau: https://www.kaggle.com/uciml/pima-indians-diabetes-database hoặc chọn một bộ dữ liệu từ DataCamp: https://www.datacamp.com/datalab/datasets. Bộ dữ liệu sẵn sàng sử dụng cho phép bạn tùy chọn huấn luyện mô hình trên DataLab, Jupyter notebook miễn phí trên đám mây của DataCamp.
Nạp dữ liệu
Chúng ta sẽ đơn giản hóa các cột bằng cách cung cấp col_names cho hàm read_csv() của pandas.
#import pandas
import pandas as pd
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
Chọn đặc trưng
Ở đây, bạn cần chia các cột đã cho thành hai loại biến: biến phụ thuộc (hoặc biến mục tiêu) và biến độc lập (hoặc biến đặc trưng).
#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable
Chia tách dữ liệu
Để hiểu hiệu năng mô hình, chia bộ dữ liệu thành tập huấn luyện và tập kiểm tra là một chiến lược tốt.
Hãy chia tách bộ dữ liệu bằng cách dùng hàm train_test_split(). Bạn cần truyền 3 tham số: features, target và kích thước test_set. Ngoài ra, bạn có thể dùng random_state để chọn các bản ghi ngẫu nhiên.
# split X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=16)
Ở đây, bộ dữ liệu được chia thành hai phần theo tỷ lệ 75:25. Nghĩa là 75% dữ liệu dùng để huấn luyện mô hình và 25% dùng để kiểm tra mô hình.
Phát triển mô hình và dự đoán
Trước hết, nhập mô-đun LogisticRegression và tạo một đối tượng bộ phân loại hồi quy logistic bằng hàm LogisticRegression() với random_state để tái lập.
Sau đó, khớp mô hình của bạn trên tập huấn luyện bằng fit() và dự đoán trên tập kiểm tra bằng predict().
# import the class
from sklearn.linear_model import LogisticRegression
# instantiate the model (using the default parameters)
logreg = LogisticRegression(random_state=16)
# fit the model with data
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
Đánh giá mô hình bằng Ma trận Nhầm lẫn
Ma trận nhầm lẫn là một bảng dùng để đánh giá hiệu năng của mô hình phân loại. Bạn cũng có thể trực quan hóa hiệu năng của một thuật toán. Thành phần cơ bản của ma trận nhầm lẫn là số lượng dự đoán đúng và sai được tổng hợp theo từng lớp.
# import the metrics class
from sklearn import metrics
cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
cnf_matrix
array([[115, 8],
[ 30, 39]])
Ở đây, bạn có thể thấy ma trận nhầm lẫn dưới dạng đối tượng mảng. Kích thước của ma trận này là 2*2 vì mô hình này là phân loại nhị phân. Bạn có hai lớp 0 và 1. Các giá trị trên đường chéo biểu thị dự đoán chính xác, trong khi các phần tử ngoài đường chéo là dự đoán không chính xác. Trong đầu ra, 115 và 39 là dự đoán đúng, còn 30 và 8 là dự đoán sai.
Trực quan hóa ma trận nhầm lẫn bằng heatmap
Hãy trực quan hóa kết quả của mô hình dưới dạng ma trận nhầm lẫn bằng matplotlib và seaborn.
Tại đây, bạn sẽ trực quan hóa ma trận nhầm lẫn bằng Heatmap.
# import required modules
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
class_names=[0,1] # name of classes
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
# create heatmap
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
Text(0.5,257.44,'Predicted label');
Các chỉ số đánh giá từ ma trận nhầm lẫn
Hãy đánh giá mô hình bằng classification_report cho độ chính xác, độ chính xác dự đoán (precision) và khả năng thu hồi (recall).
from sklearn.metrics import classification_report
target_names = ['without diabetes', 'with diabetes']
print(classification_report(y_test, y_pred, target_names=target_names))
precision recall f1-score support
without diabetes 0.79 0.93 0.86 123
with diabetes 0.83 0.57 0.67 69
accuracy 0.80 192
macro avg 0.81 0.75 0.77 192
weighted avg 0.81 0.80 0.79 192
Bạn đạt tỷ lệ phân loại là 80%, được xem là độ chính xác tốt.
Precision: Precision nói về mức độ chính xác, tức mô hình của bạn chính xác đến đâu. Nói cách khác, khi mô hình đưa ra dự đoán, nó đúng với tần suất như thế nào. Trong trường hợp của bạn, khi mô hình hồi quy logistic dự đoán bệnh nhân sẽ mắc tiểu đường, điều đó đúng 73% thời gian.
Recall: Nếu trong tập kiểm tra có những bệnh nhân mắc tiểu đường, mô hình hồi quy logistic của bạn có thể nhận diện được 57% số đó.
Đường cong ROC
Đường cong Đặc trưng Vận hành Máy thu (ROC) là đồ thị giữa tỷ lệ dương tính thật và tỷ lệ dương tính giả. Nó cho thấy sự đánh đổi giữa độ nhạy và độ đặc hiệu.
y_pred_proba = logreg.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)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
plt.legend(loc=4)
plt.show()

Điểm AUC cho trường hợp này là 0,88. AUC bằng 1 biểu thị bộ phân loại hoàn hảo, còn 0,5 biểu thị bộ phân loại vô giá trị.
Mã nguồn có trên DataLab: Understanding Logistic Regression in Python.
Ưu điểm
Nhờ tính hiệu quả và đơn giản, nó không đòi hỏi sức mạnh tính toán cao, dễ triển khai, dễ diễn giải và được các nhà phân tích dữ liệu, nhà khoa học dữ liệu sử dụng rộng rãi. Ngoài ra, nó không yêu cầu chuẩn hóa thang đo đặc trưng. Hồi quy logistic cung cấp điểm xác suất cho các quan sát.
Nhược điểm
Hồi quy logistic không xử lý tốt số lượng lớn đặc trưng/biến phân loại. Nó dễ bị quá khớp. Đồng thời, nó không thể giải quyết các vấn đề phi tuyến, vì vậy cần biến đổi các đặc trưng phi tuyến. Hồi quy logistic sẽ hoạt động không tốt nếu các biến độc lập không tương quan với biến mục tiêu và rất giống nhau hoặc tương quan mạnh với nhau.
Kết luận
Trong hướng dẫn này, bạn đã tìm hiểu nhiều chi tiết về hồi quy logistic. Bạn đã học hồi quy logistic là gì, cách xây dựng các mô hình tương ứng, cách trực quan hóa kết quả và một số nền tảng lý thuyết. Bạn cũng đã đề cập đến một số khái niệm cơ bản như hàm sigmoid, hợp lý cực đại, ma trận nhầm lẫn, đường cong ROC.
Hy vọng giờ đây bạn có thể áp dụng kỹ thuật Hồi quy Logistic để phân tích các bộ dữ liệu của riêng mình. Cảm ơn bạn đã đọc hướng dẫn!
Nếu bạn muốn học thêm về Hồi quy Logistic, hãy tham gia khóa Machine Learning với scikit-learn của DataCamp. Bạn cũng có thể bắt đầu hành trình trở thành kỹ sư học máy bằng cách đăng ký lộ trình nghề nghiệp Machine Learning Scientist with Python.

