Skip to content

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

Spread the love

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)
mtcars$am <- factor(mtcars$am, 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:

  • So sánh nhãn dự đoán với nhãn thật trên tập test.
  • Tính tỉ lệ dự đoán đúng.
accuracy <- mean(pred == test_data$am)
print(paste("Độ chính xác trên tập test:", round(accuracy, 2)))

🚘 7. Dự đoán cho một mẫu xe mới:

  • Dự đoán xác suất một xe có mpg = 22, hp = 110, wt = 2.5 sẽ là xe số tự động.
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)))


Code R – Logistic Regression với mtcars




# 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)
mtcars$am <- factor(mtcars$am, 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_data$am)
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
mtcars$am <- factor(mtcars$am, 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_scaled$am <- train_data$am
test_scaled$am <- test_data$am
# 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 

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!