Phân tích dữ liệu lớn - Hồi quy logistic

Hồi quy logistic là một mô hình phân loại trong đó biến phản hồi là phân loại. Nó là một thuật toán xuất phát từ thống kê và được sử dụng cho các bài toán phân loại có giám sát. Trong hồi quy logistic, chúng ta tìm kiếm vectơ β của các tham số trong phương trình sau đây mà hàm chi phí tối thiểu hóa.

$$ logit (p_i) = ln \ left (\ frac {p_i} {1 - p_i} \ right) = \ beta_0 + \ beta_1x_ {1, i} + ... + \ beta_kx_ {k, i} $$

Đoạn mã sau đây trình bày cách phù hợp với mô hình hồi quy logistic trong R. Chúng tôi sẽ sử dụng ở đây tập dữ liệu spam để chứng minh hồi quy logistic, giống như được sử dụng cho Naive Bayes.

Từ các kết quả dự đoán về độ chính xác, chúng tôi thấy rằng mô hình hồi quy đạt được độ chính xác 92,5% trong bộ thử nghiệm, so với 72% đạt được bởi bộ phân loại Naive Bayes.

library(ElemStatLearn)
head(spam) 

# Split dataset in training and testing 
inx = sample(nrow(spam), round(nrow(spam) * 0.8)) 
train = spam[inx,] 
test = spam[-inx,]  

# Fit regression model 
fit = glm(spam ~ ., data = train, family = binomial()) 
summary(fit)  

# Call: 
#   glm(formula = spam ~ ., family = binomial(), data = train) 
#  

# Deviance Residuals:  
#   Min       1Q   Median       3Q      Max   
# -4.5172  -0.2039   0.0000   0.1111   5.4944
# Coefficients: 
# Estimate Std. Error z value Pr(>|z|)     
# (Intercept) -1.511e+00  1.546e-01  -9.772  < 2e-16 *** 
# A.1         -4.546e-01  2.560e-01  -1.776 0.075720 .   
# A.2         -1.630e-01  7.731e-02  -2.108 0.035043 *   
# A.3          1.487e-01  1.261e-01   1.179 0.238591     
# A.4          2.055e+00  1.467e+00   1.401 0.161153     
# A.5          6.165e-01  1.191e-01   5.177 2.25e-07 *** 
# A.6          7.156e-01  2.768e-01   2.585 0.009747 **  
# A.7          2.606e+00  3.917e-01   6.652 2.88e-11 *** 
# A.8          6.750e-01  2.284e-01   2.955 0.003127 **  
# A.9          1.197e+00  3.362e-01   3.559 0.000373 *** 
# Signif. codes:  0 *** 0.001 ** 0.01 * 0.05 . 0.1  1  

### Make predictions 
preds = predict(fit, test, type = ’response’) 
preds = ifelse(preds > 0.5, 1, 0) 
tbl = table(target = test$spam, preds) 
tbl 

#         preds 
# target    0   1 
# email   535  23 
# spam     46 316 
sum(diag(tbl)) / sum(tbl) 
# 0.925