Chuyển đến nội dung chính

Hướng dẫn Hồi quy Logistic trong R

Tìm hiểu mọi thứ về hồi quy logistic: khác gì so với hồi quy tuyến tính, cách fitting và đánh giá các mô hình này trong R với hàm glm() và hơn thế nữa!
Đã cập nhật 5 thg 10, 2026  · 14 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này

Chạy mã

Hồi quy logistic là một mô hình đơn giản nhưng mạnh mẽ để dự đoán các kết quả nhị phân, tức là một việc sẽ xảy ra hay không. Đây là một dạng mô hình phân loại cho học máy giám sát.

Hồi quy logistic được dùng trong hầu như mọi ngành—tiếp thị, y tế, khoa học xã hội, và nhiều lĩnh vực khác—và là một phần thiết yếu trong bộ công cụ của mọi nhà khoa học dữ liệu.

Để tận dụng tối đa hướng dẫn này, bạn cần hiểu biết cơ bản về R. Việc biết về một mô hình liên quan là hồi quy tuyến tính cũng hữu ích. Hãy đọc Hướng dẫn Hồi quy tuyến tính trong R để tìm hiểu về chủ đề đó.

Tổng quan về Hồi quy Logistic

Giả sử bạn muốn dự đoán hôm nay có nắng hay không. Có hai kết quả có thể xảy ra: "nắng" hoặc "không nắng". Biến kết quả còn được gọi là "biến đích" hoặc "biến phụ thuộc".

Có nhiều biến có thể ảnh hưởng đến kết quả như ‘nhiệt độ ngày hôm trước’, ‘áp suất không khí’... Các biến ảnh hưởng này được gọi là đặc trưng, biến độc lập, hoặc biến dự báo—tất cả các thuật ngữ này đều cùng nghĩa. 

Những ví dụ khác gồm: khách hàng có mua sản phẩm của bạn hay không, email có phải spam hay không, giao dịch có gian lận hay không, và thuốc có chữa khỏi bệnh cho bệnh nhân hay không.  

Hồi quy logistic hoạt động như thế nào?

Hồi quy logistic tìm ra phép khớp tốt nhất giữa các biến dự báo và biến đích để dự đoán xác suất biến đích thuộc về một lớp/nhãn nhất định. 

Hồi quy tuyến tính cố gắng tìm đường thẳng tốt nhất để dự đoán kết quả từ các đặc trưng. Nó tạo thành phương trình như

y_predictions = intercept + slope * features

và dùng tối ưu hóa để tìm giá trị tốt nhất có thể cho hệ số chặn và hệ số góc.

Hồi quy logistic hoạt động tương tự, ngoại trừ việc nó hồi quy trên xác suất của kết quả thuộc về một danh mục. Nó dùng hàm sigmoid (hàm phân phối tích lũy của phân phối logistic) để biến đổi vế phải của phương trình đó.

y_predictions = logistic_cdf(intercept + slope * features)

Một lần nữa, mô hình sử dụng tối ưu hóa để tìm giá trị tốt nhất có thể cho hệ số chặn và hệ số góc.

Vì thuật toán cho hồi quy logistic rất giống với phương trình của hồi quy tuyến tính, nó thuộc một họ mô hình gọi là "mô hình tuyến tính tổng quát". Đây là lý do hồi quy logistic có chữ "regression" trong tên, dù thực chất là mô hình phân loại.

Hàm sigmoid có dạng đường cong chữ S như trong hình dưới. Nó nhận đầu vào là các giá trị thực và chuyển chúng về khoảng 0 đến 1 (bằng cách ép từ hai phía, tức là các giá trị âm về 0 và các giá trị dương rất lớn về 1). Hơn nữa, ngưỡng cắt (cut-off) là yếu tố quyết định chồng lên trên các xác suất này để chia kết quả thành các danh mục hay lớp.

image4.png

Những khái niệm phức tạp sẽ dễ hiểu nhất khi được minh họa bằng ví dụ, vì vậy hãy lấy một phép so sánh để hình dung cách thuật toán LR hoạt động. Giả sử mô hình LR được giao nhiệm vụ nhận diện một giao dịch gian lận bằng cách xem xét nhiều chỉ báo gian lận, như vị trí người dùng, số tiền mua, địa chỉ IP, v.v. Mục tiêu là xác định khả năng một giao dịch là hợp lệ hay gian lận – đó chính là biến đích.

Mô hình gán trọng số cho các biến dự báo dựa trên mức độ chúng tác động đến biến đích và kết hợp chúng để tính điểm chuẩn hóa hay xác suất gian lận. 

Bộ dữ liệu

Chúng ta sẽ dùng một bộ dữ liệu chiến dịch tiếp thị trực tiếp của một tổ chức ngân hàng Bồ Đào Nha thông qua các cuộc gọi điện thoại. Chiến dịch nhằm bán đăng ký tiền gửi có kỳ hạn của ngân hàng, được biểu diễn bởi biến y (có đăng ký hoặc không). Mục tiêu của mô hình hồi quy logistic là dự đoán liệu một khách hàng có mua đăng ký hay không dựa trên các biến dự báo, tức thuộc tính của khách hàng như thông tin nhân khẩu học.

image1.png

Từ điển dữ liệu cho bộ dữ liệu này và nhiều bộ dữ liệu hữu ích khác có trên trang web của Datacamp.

Biến

Mô tả

Chi tiết

age

tuổi của khách hàng

 

job

loại công việc

phân loại: "admin.","blue-collar","entrepreneur","housemaid","management","retired","self-employed","services","student","technician","unemployed","unknown"

marital

tình trạng hôn nhân

phân loại: "divorced","married","single","unknown"; lưu ý: "divorced" bao gồm ly hôn hoặc góa

education

bằng cấp cao nhất của khách hàng

phân loại: "basic.4y","basic.6y","basic.9y","high.school","illiterate","professional.course","university.degree","unknown"

default

có tín dụng vỡ nợ không?

phân loại: "no","yes","unknown"

housing

có khoản vay mua nhà không?

phân loại: "no","yes","unknown"

loan

có vay tiêu dùng không?

phân loại: "no","yes","unknown"

contact

kiểu kênh liên hệ

phân loại: "cellular","telephone"

month

tháng liên hệ cuối cùng trong năm

phân loại: "jan", "feb", "mar", ..., "nov", "dec"

day_of_week

ngày trong tuần của lần liên hệ cuối

phân loại: "mon","tue","wed","thu","fri"

campaign

số lần liên hệ khách hàng trong chiến dịch này

số, bao gồm lần liên hệ cuối

pdays

số ngày kể từ lần liên hệ gần nhất ở chiến dịch trước

số; 999 nghĩa là khách hàng chưa từng được liên hệ trước đó

previous

số lần liên hệ đã thực hiện trước chiến dịch này cho khách hàng này

số

poutcome

kết quả chiến dịch tiếp thị trước

phân loại: "failure","nonexistent","success"

emp.var.rate

tốc độ biến động việc làm - chỉ báo theo quý

số

cons.price.idx

chỉ số giá tiêu dùng - chỉ báo theo tháng

số

cons.conf.idx

chỉ số niềm tin người tiêu dùng - chỉ báo theo tháng

số

euribor3m

lãi suất euribor 3 tháng - chỉ báo theo ngày

số

nr.employed

số lượng nhân viên - chỉ báo theo quý

số

y

khách hàng có đăng ký tiền gửi có kỳ hạn không?

nhị phân: "yes","no"

Quy trình Hồi quy Logistic

Toàn bộ quy trình học máy được trình bày trong infographic Hướng dẫn Quy trình Học máy cho Người mới bắt đầu. Ở đây, chúng ta tập trung vào các bước chuẩn bị dữ liệu và xây dựng mô hình. Cụ thể, chúng ta sẽ đề cập:

  • Chia dữ liệu thành tập huấn luyện và tập kiểm tra
  • Fitting (huấn luyện) mô hình
  • Tạo dự đoán
  • Đánh giá hiệu năng mô hình
  • Điều chỉnh siêu tham số

Gói Hồi quy Logistic

Trong R, có hai quy trình làm việc phổ biến để mô hình hóa hồi quy logistic: base-R và tidymodels.

Quy trình base-R đơn giản hơn và bao gồm các hàm như glm() và summary() để fit mô hình và tạo tóm tắt mô hình.

Quy trình tidymodels cho phép quản lý nhiều mô hình dễ dàng hơn và cung cấp giao diện nhất quán để làm việc với các loại mô hình khác nhau.

Hướng dẫn này sẽ sử dụng quy trình tidymodels.

Trực quan hóa Dữ liệu

Nạp gói tidymodels bằng cách gọi hàm library(). 

Bộ dữ liệu nằm trong tệp CSV với định dạng kiểu châu Âu (dấu phẩy cho phần thập phân và dấu chấm phẩy cho phân tách). Chúng ta sẽ đọc nó bằng read_csv2() từ gói readr. 

Chuyển biến đích y thành biến factor để phục vụ mô hình hóa. 

Dùng hàm ggplot() để vẽ số lượng của từng nghề nghiệp theo biến y.

library(readr)
library(tidymodels)

# Read the dataset and convert the target variable to a factor
bank_df <- read_csv2("bank-full.csv")
bank_df$y = as.factor(bank_df$y)

# Plot job occupation against the target variable
ggplot(bank_df, aes(job, fill = y)) +
    geom_bar() +
    coord_flip()

image5.png

Chia Dữ liệu

Hãy chia bộ dữ liệu thành tập huấn luyện để fit mô hình và tập kiểm tra để đánh giá mô hình, nhằm đảm bảo mô hình đã huấn luyện hoạt động tốt trên dữ liệu chưa từng thấy.

Việc chia dữ liệu thành tập huấn luyện và kiểm tra có thể thực hiện bằng hàm initial_split() và thuộc tính prop xác định tỷ lệ dữ liệu huấn luyện.

# Split data into train and test
set.seed(421)
split <- initial_split(bank_df, prop = 0.8, strata = y)
train <- split %>% 
         training()
test <- split %>% 
        testing()

Fit và Đánh giá Mô hình

Để tạo mô hình, khai báo một mô hình logistic_reg(). Mô hình này cần các đối số mixture và penalty để điều khiển mức độ regularization. Giá trị mixture bằng 1 là mô hình lasso và bằng 0 là ridge regression. Các giá trị ở giữa cũng được chấp nhận. Đối số penalty biểu thị độ mạnh của regularization.

Lưu ý bạn cần truyền các số dấu phẩy động kiểu "double" cho mixture và penalty

Đặt "engine" (phần mềm backend dùng để chạy tính toán) bằng set_engine(). Có một số lựa chọn: Engine mặc định là "glm", thực hiện hồi quy logistic cổ điển. Điều này thường được các nhà thống kê ưa thích vì bạn nhận được p-value cho từng hệ số, giúp dễ hiểu tầm quan trọng của mỗi hệ số.

Ở đây chúng ta sẽ dùng engine "glmnet". Điều này được các nhà khoa học máy học ưa chuộng vì nó cho phép regularization, có thể cải thiện dự đoán, đặc biệt khi bạn có nhiều đặc trưng. (Trong Python, gói scikit-learn mặc định bao gồm một số regularization trong hồi quy logistic.)

Gọi phương thức fit() để huấn luyện mô hình trên dữ liệu huấn luyện đã tạo ở bước trước. Đối số đầu tiên là một công thức. Ở vế trái của công thức, bạn dùng biến đích (trong trường hợp này là y). Ở vế phải, bạn có thể đưa vào bất kỳ đặc trưng nào bạn muốn. Dấu chấm nghĩa là "dùng tất cả các biến không được viết ở vế trái của công thức". Để biết thêm về cách viết công thức, hãy đọc Hướng dẫn Công thức R.

# Train a logistic regression model
model <- logistic_reg(mixture = double(1), penalty = double(1)) %>%
  set_engine("glmnet") %>%
  set_mode("classification") %>%
  fit(y ~ ., data = train)

# Model summary
tidy(model)

Đầu ra hiển thị dưới đây với cột estimate biểu diễn các hệ số của biến dự báo.

# A tibble: 43 × 3
   term              estimate penalty
   <chr>                <dbl>   <dbl>
 1 (Intercept)      -2.59           0
 2 age              -0.000477       0
 3 jobblue-collar   -0.183          0
 4 jobentrepreneur  -0.206          0
 5 jobhousemaid     -0.270          0
 6 jobmanagement    -0.0190         0
 7 jobretired        0.360          0
 8 jobself-employed -0.101          0
 9 jobservices      -0.105          0
10 jobstudent        0.415          0
# ... with 33 more rows
# ℹ Use `print(n = ...)` to see more rows

Tạo dự đoán

Tạo dự đoán trên dữ liệu kiểm tra bằng hàm predict(). Bạn có thể chọn kiểu dự đoán.

  • type = "class" trả về giá trị đích có khả năng cao nhất cho mỗi quan sát. Ở đây, nó sẽ trả về "yes" hoặc "no" tùy việc mô hình cho rằng khách hàng có khả năng đăng ký tiền gửi kỳ hạn hay không.
  • type = "prob" trả về xác suất của từng giá trị đích cho mỗi quan sát. Ở đây, nó sẽ trả về xác suất "yes" và xác suất "no" (tổng bằng một cho mỗi quan sát).
# Class Predictions
pred_class <- predict(model,
                      new_data = test,
                      type = "class")

# Class Probabilities
pred_proba <- predict(model,
                      new_data = test,
                      type = "prob")

Đánh giá mô hình bằng hàm accuracy() với đối số truth là y và đối số estimate là các dự đoán từ bước trước.

results <- test %>%
           select(y) %>%
           bind_cols(pred_class, pred_proba)

accuracy(results, truth = y, estimate = .pred_class)

Điều chỉnh Siêu tham số

Thay vì truyền trực tiếp các giá trị cho mixture và penalty ("siêu tham số"), bạn có thể tối ưu hóa sức mạnh dự đoán của mô hình bằng cách tinh chỉnh chúng. 

Ý tưởng là chạy mô hình nhiều lần với các giá trị siêu tham số khác nhau và xem giá trị nào cho dự đoán tốt nhất.

  • Trong hàm logistic_reg(), đặt các đối số mixture và penalty thành lời gọi tune().
  • Dùng hàm grid_regular() để định nghĩa lưới các giá trị khả dĩ cho mixture và penalty.
  • Hàm workflow() tạo một đối tượng để lưu chi tiết mô hình, cần thiết khi bạn chạy mô hình nhiều lần. 
  • Chọn mô hình tốt nhất bằng hàm select_best(). Bạn có thể chọn trong số các chỉ số để định nghĩa mô hình "tốt nhất". Ở đây, chúng ta sẽ dùng chỉ số "diện tích dưới đường cong ROC" (ROC AUC).
# Define the logistic regression model with penalty and mixture hyperparameters
log_reg <- logistic_reg(mixture = tune(), penalty = tune(), engine = "glmnet")

# Define the grid search for the hyperparameters
grid <- grid_regular(mixture(), penalty(), levels = c(mixture = 4, penalty = 3))

# Define the workflow for the model
log_reg_wf <- workflow() %>%
  add_model(log_reg) %>%
  add_formula(y ~ .)

# Define the resampling method for the grid search
folds <- vfold_cv(train, v = 5)

# Tune the hyperparameters using the grid search
log_reg_tuned <- tune_grid(
  log_reg_wf,
  resamples = folds,
  grid = grid,
  control = control_grid(save_pred = TRUE)
)

select_best(log_reg_tuned, metric = "roc_auc")
# A tibble: 1 × 3
       penalty mixture .config              
         <dbl>   <dbl> <chr>                
1 0.0000000001       0 Preprocessor1_Model01

Nhiều Chỉ số Đánh giá hơn

Sử dụng các siêu tham số tốt nhất:

  1. Hãy huấn luyện một mô hình hồi quy logistic
  2. Dùng nó để tạo dự đoán trên tập kiểm tra
  3. Tạo ma trận nhầm lẫn bằng giá trị thực và giá trị ước lượng
# Fit the model using the optimal hyperparameters
log_reg_final <- logistic_reg(penalty = 0.0000000001, mixture = 0) %>%
                 set_engine("glmnet") %>%
                 set_mode("classification") %>%
                 fit(y~., data = train)

# Evaluate the model performance on the testing set
pred_class <- predict(log_reg_final,
                      new_data = test,
                      type = "class")
results <- test %>%
  select(y) %>%
  bind_cols(pred_class, pred_proba)

# Create confusion matrix
conf_mat(results, truth = y,
         estimate = .pred_class)
Truth
Prediction   no  yes
       no  7838  738
       yes  147  320

Bạn có thể tính precision (giá trị dự đoán dương tính, số dương tính thật chia cho số dương tính dự đoán) bằng hàm precision().

precision(results, truth = y,
          estimate = .pred_class)
# A tibble: 1 × 3
  .metric   .estimator .estimate
  <chr>     <chr>          <dbl>
1 precision binary         0.914

Tương tự, bạn có thể tính recall (độ nhạy, số dương tính thật chia cho số dương tính thực tế) bằng hàm recall().

recall(results, truth = y,
          estimate = .pred_class)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 recall  binary         0.982

Hãy tìm hiểu các biến ảnh hưởng đến quyết định mua đăng ký. Trong bối cảnh hồi quy logistic, các hệ số quyết định độ nhạy của biến đích với từng biến dự báo. Hệ số càng lớn thì mức độ quan trọng càng cao. Sắp xếp các biến theo thứ tự giảm dần của giá trị tuyệt đối hệ số và chỉ hiển thị các hệ số có giá trị tuyệt đối lớn hơn 0,5.

coeff <- tidy(log_reg_final) %>% 
  arrange(desc(abs(estimate))) %>% 
  filter(abs(estimate) > 0.5)
# A tibble: 10 × 3
   term            estimate      penalty
   <chr>              <dbl>        <dbl>
 1 (Intercept)       -2.59  0.0000000001
 2 poutcomesuccess    2.08  0.0000000001
 3 monthmar           1.62  0.0000000001
 4 monthoct           1.08  0.0000000001
 5 monthsep           1.03  0.0000000001
 6 contactunknown    -1.01  0.0000000001
 7 monthdec           0.861 0.0000000001
 8 monthjan          -0.820 0.0000000001
 9 housingyes        -0.550 0.0000000001
10 monthnov          -0.517 0.0000000001

Vẽ biểu đồ tầm quan trọng đặc trưng bằng hàm ggplot().

ggplot(coeff, aes(x = term, y = estimate, fill = term)) + geom_col() + coord_flip()

image2.png

Nâng cao hơn

Đến đây, chúng ta đã gần kết thúc hướng dẫn, trong đó minh họa cách huấn luyện và đánh giá một mô hình hồi quy logistic bằng gói tidymodels. Nội dung cũng bao gồm cách diễn giải kết quả mô hình và vẽ các biểu đồ như tầm quan trọng đặc trưng. 

Nếu bạn muốn tìm hiểu thêm về việc xây dựng mô hình AI bằng tidymodels, hãy xem khóa Modeling with tidymodels in R. Để mô hình hóa theo cách tiếp cận base-R, hãy xem các khóa Introduction to Regression in R, Intermediate Regression in R, và Generalized Linear Models in R.

Chủ đề
R
Khoa học Dữ liệu

Khóa học R

Khóa học

Nhập môn Ngôn ngữ lập trình R

4 giờ
3.1M
Nắm vững kiến thức cơ bản về phân tích dữ liệu trong R, gồm vectors, lists và data frames; luyện tập R với các data set thực tế.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm