Ví dụ về hồi quy Logistic trong R trên bộ dữ liệu mtcars

Tuyệt! Dưới đây là một ví dụ hồi quy logistic trong R sử dụng bộ dữ liệu mtcars, một bộ dữ liệu rất phổ biến chứa thông tin về các loại xe.

🎯 Mục tiêu: Dự đoán xe có phải số tự động hay không (am: 0 = số tay, 1 = số tự động) dựa trên một số đặc điểm như mpg (miles per gallon – mức tiêu thụ nhiên liệu), hp (horsepower – mã lực), và wt (trọng lượng xe).

Những quan sát đầu tiên:

Mazda RX421.061601103.902.62016.460Automatic44
Mazda RX4 Wag21.061601103.902.87517.020Automatic44
Datsun 71022.84108933.852.32018.611Automatic41
Hornet 4 Drive21.462581103.083.21519.441Manual31
Hornet Sportabout18.783601753.153.44017.020Manual32
Valiant18.162251052.763.46020.221Manual31

📊 1. Chuẩn bị dữ liệu:

data(mtcars)
mtcarsam <- factor(mtcarsam, levels = c(0, 1), labels = c("Manual", "Automatic"))
  • Dùng dữ liệu sẵn có mtcars.
  • Biến mục tiêu am được chuyển sang dạng nhãn với hai mức: ManualAutomatic.

✂️ 2. Tách tập train/test:

set.seed(42)
train_idx <- sample(1:nrow(mtcars), 0.7 * nrow(mtcars))
train_data <- mtcars[train_idx, ]
test_data <- mtcars[-train_idx, ]
  • Dùng sample() để chọn ngẫu nhiên 70% dữ liệu làm tập huấn luyện.
  • Phần còn lại là tập kiểm tra.

⚙️ 3. Huấn luyện mô hình hồi quy logistic:

model <- glm(am ~ mpg + hp + wt, data = train_data, family = binomial)
  • glm() với hàm phân phối nhị phân binomial.
  • Dự đoán loại số xe (am) dựa trên:
  • mpg: mức tiêu hao nhiên liệu.
  • hp: mã lực.
  • wt: trọng lượng xe.

🧪 4. Kiểm tra mô hình:

summary(model)
  • Hiển thị hệ số hồi quy, độ tin cậy, và ý nghĩa thống kê từng biến.

📈 5. Dự đoán trên tập kiểm tra:

prob <- predict(model, newdata = test_data, type = "response")
pred <- ifelse(prob > 0.5, "Automatic", "Manual")
  • Dự đoán xác suất bằng hàm predict().
  • Chuyển xác suất thành nhãn bằng ngưỡng 0.5.

6. Tính độ chính xác:

accuracy <- mean(pred == test_dataam) print(paste("Độ chính xác trên tập test:", round(accuracy, 2)))</pre> <!-- /wp:syntaxhighlighter/code -->  <!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li>So sánh nhãn dự đoán với nhãn thật trên tập test.</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li>Tính tỉ lệ dự đoán đúng.</li> <!-- /wp:list-item --></ul> <!-- /wp:list -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">🚘 <strong>7. Dự đoán cho một mẫu xe mới:</strong></h3> <!-- /wp:heading -->  <!-- wp:syntaxhighlighter/code --> <pre class="wp-block-syntaxhighlighter-code">new_car <- data.frame(mpg = 22, hp = 110, wt = 2.5) new_prob <- predict(model, newdata = new_car, type = "response") print(paste("Xác suất xe là số tự động:", round(new_prob, 2)))</pre> <!-- /wp:syntaxhighlighter/code -->  <!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li>Dự đoán xác suất một xe có <code>mpg = 22</code>, <code>hp = 110</code>, <code>wt = 2.5</code> sẽ là xe <strong>số tự động</strong>.</li> <!-- /wp:list-item --></ul> <!-- /wp:list -->  <!-- wp:paragraph -->  <!-- /wp:paragraph -->  <!-- wp:paragraph -->  <!-- /wp:paragraph -->  <!-- wp:separator --> <hr class="wp-block-separator has-alpha-channel-opacity"/> <!-- /wp:separator -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">✅ <strong>Code R - Logistic Regression với <code>mtcars</code></strong></h3> <!-- /wp:heading -->  <!-- wp:syntaxhighlighter/code --> <pre class="wp-block-syntaxhighlighter-code"># Dữ liệu mtcars có sẵn trong R data(mtcars)  # Biến mục tiêu: am (0 = số tay, 1 = số tự động) mtcarsam <- factor(mtcarsam, levels = c(0, 1), labels = c("Manual", "Automatic"))  # Xem qua dữ liệu head(mtcars)  # Tách dữ liệu train/test (70% train) set.seed(42) train_idx <- sample(1:nrow(mtcars), 0.7 * nrow(mtcars)) train_data <- mtcars[train_idx, ] test_data <- mtcars[-train_idx, ]  # Huấn luyện mô hình hồi quy logistic model <- glm(am ~ mpg + hp + wt, data = train_data, family = binomial)  # Tóm tắt mô hình summary(model)  # Dự đoán xác suất trên tập test prob <- predict(model, newdata = test_data, type = "response")  # Chuyển sang nhãn 0/1 với ngưỡng 0.5 pred <- ifelse(prob > 0.5, "Automatic", "Manual")  # Tính độ chính xác accuracy <- mean(pred == test_dataam)
print(paste("Độ chính xác trên tập test:", round(accuracy, 2)))

# Dự đoán cho một mẫu mới
new_car <- data.frame(mpg = 22, hp = 110, wt = 2.5)
new_prob <- predict(model, newdata = new_car, type = "response")
print(paste("Xác suất xe là số tự động:", round(new_prob, 2)))

🧠 Giải thích nhanh:

  • glm(..., family = binomial) là cách tạo mô hình hồi quy logistic trong R.
  • am là biến mục tiêu nhị phân: số tay hoặc số tự động.
  • predict(..., type = "response") trả về xác suất.
  • ifelse(... > 0.5) chuyển xác suất thành nhãn (0 hoặc 1).

Chạy code trên Colab

Kết quả

Warning message:
“glm.fit: fitted probabilities numerically 0 or 1 occurred”
Call:
glm(formula = am ~ mpg + hp + wt, family = binomial, data = train_data)

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -764.723 1095.499 -0.698 0.485
mpg 33.960 48.137 0.705 0.481
hp 1.985 2.796 0.710 0.478
wt -63.783 85.697 -0.744 0.457

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 27.5216 on 21 degrees of freedom
Residual deviance: 5.0333 on 18 degrees of freedom
AIC: 13.033

📌 Giải thích kết quả hồi quy logistic trên dữ liệu mtcars:


Cảnh báo:

Warning message:
“glm.fit: fitted probabilities numerically 0 or 1 occurred”

🔍 Ý nghĩa: Một số giá trị xác suất dự đoán rất gần 0 hoặc 1 tuyệt đối. Điều này có thể xảy ra khi mô hình quá khớp hoặc dữ liệu quá phân biệt → khiến ước lượng tham số không ổn định. Tuy nhiên, ở đây, chúng ta đã sử dụng train test split nên chúng ta có thể dễ dàng kiểm điều này


📊 Bảng hệ số mô hình:

BiếnEstimateStd. Errorz valuePr(>z)
(Intercept)-764.7231095.499-0.6980.485
mpg33.96048.1370.7050.481
hp1.9852.7960.7100.478
wt-63.78385.697-0.7440.457

🔍 Diễn giải:

  • Các biến mpg, hp, và wt đều không có ý nghĩa thống kê (p > 0.05).
  • Giá trị Estimate cho thấy xu hướng ảnh hưởng lên khả năng xe là số tự động:
    • mpg tăng → khả năng số tự động tăng
    • wt tăng → khả năng số tự động giảm

📉 Tuy nhiên vì p-value cao, ta không thể kết luận chắc chắn ảnh hưởng của các biến này.


📎 Thông số mô hình:

  • Null deviance = 27.52: sai số mô hình không có biến giải thích.
  • Residual deviance = 5.03: sai số sau khi có mô hình.
  • AIC = 13.03: chỉ số đánh giá tổng thể, càng thấp càng tốt.

✅ Việc deviance giảm từ 27.5 xuống 5.0 → mô hình cải thiện đáng kể so với mô hình null. Nhưng vì kích thước mẫu nhỏ (22 mẫu) và các biến không thật sự có ý nghĩa thống kê → cần thận trọng khi sử dụng kết quả này.


Bây giờ mình sẽ hướng dẫn bạn cách huấn luyện mô hình hồi quy logistic trong R sử dụng toàn bộ các đặc trưng đầu vào (predictors), đã được chuẩn hóa, trên bộ dữ liệu mtcars.

# Load dữ liệu
data(mtcars)

# Biến mục tiêu nhị phân
mtcarsam <- factor(mtcarsam, levels = c(0, 1), labels = c("Manual", "Automatic"))

# Chia train/test
set.seed(42)
train_idx <- sample(1:nrow(mtcars), 0.7 * nrow(mtcars))
train_data <- mtcars[train_idx, ]
test_data <- mtcars[-train_idx, ]

# Danh sách các đặc trưng đầu vào (loại trừ "am")
predictor_names <- setdiff(names(mtcars), "am")

# CHUẨN HÓA: scale toàn bộ đặc trưng đầu vào
train_scaled <- as.data.frame(scale(train_data[, predictor_names]))
test_scaled <- as.data.frame(scale(test_data[, predictor_names],
                                   center = attr(scale(train_data[, predictor_names]), "scaled:center"),
                                   scale = attr(scale(train_data[, predictor_names]), "scaled:scale")))

# Thêm biến mục tiêu vào tập train/test đã chuẩn hóa
train_scaledam <- train_dataam
test_scaledam <- test_dataam

# Tạo công thức hồi quy sử dụng tất cả đặc trưng
formula_all <- as.formula(paste("am ~", paste(predictor_names, collapse = " + ")))

# Huấn luyện mô hình hồi quy logistic
model <- glm(formula_all, data = train_scaled, family = binomial)

# Tóm tắt mô hình
summary(model)

# Dự đoán xác suất trên test
prob <- predict(model, newdata = test_scaled, type = "response")

# Chuyển xác suất thành nhãn
pred <- ifelse(prob > 0.5, "Automatic", "Manual")

# Độ chính xác
accuracy <- mean(pred == test_scaled$am)
cat("Độ chính xác trên tập test:", round(accuracy, 2), "\n")

Chạy code trên Colab

Kết quả

Warning message:
“glm.fit: fitted probabilities numerically 0 or 1 occurred”
Call:
glm(formula = formula_all, family = binomial, data = train_scaled)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)     -9.366  81279.146       0        1
mpg              7.814 358732.690       0        1
cyl            -34.665 456027.666       0        1
disp           -13.914 539627.985       0        1
hp               7.873 275453.929       0        1
drat            -3.735 260553.554       0        1
wt              20.083 484060.906       0        1
qsec           -24.101 214333.370       0        1
vs             -19.829 182882.890       0        1
gear            25.524 199676.246       0        1
carb           -19.892 296816.754       0        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.7522e+01  on 21  degrees of freedom
Residual deviance: 2.6792e-10  on 11  degrees of freedom
AIC: 22

Number of Fisher Scoring iterations: 25
Độ chính xác trên tập test: 0.9 

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

error: Content is protected !!