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 RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | Automatic | 4 | 4 |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | Automatic | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | Automatic | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | Manual | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | Manual | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | Manual | 3 | 1 |
📊 1. Chuẩn bị dữ liệu:
data(mtcars) 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:Manual
vàAutomatic
.
✂️ 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ânbinomial
.- 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 <- factor(mtcars
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).
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ến | 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 |
🔍 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ăngwt
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, 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 test_scaled
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")
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