机器学习——逻辑回归
逻辑回归(Logistic Regression)是一种用于解决分类问题的统计学习方法,尽管其名称中包含"回归"一词,但它实际上用于处理分类问题而不是回归问题。逻辑回归的主要目标是预测某个事件发生的概率。
逻辑回归的基本思想是使用一个或多个自变量的线性组合来估计某个事件发生的概率。为了确保输出是概率值,逻辑回归使用了一个称为“逻辑函数”或“Sigmoid函数”的特殊函数。逻辑函数的公式为:
逻辑回归通过最小化损失函数来学习模型参数。常用的损失函数是对数损失函数(log loss),其目标是最小化模型对观测样本的负对数似然。
逻辑回归在实际应用中广泛用于二分类问题,如垃圾邮件识别、疾病诊断等场景。它也可以扩展到多分类问题,称为多类别逻辑回归或Softmax回归。
逻辑回归是一种非常流行的分类算法,尤其是在医学界,部分原因是模型的可解释性。对于我们模型中的每个预测变量,我们得到了该变量值如何影响一个案例属于一个类别而不是另一个类别的概率的估计。
逻辑回归学习输出属于每个类的新数据的概率(p) 的模型。通常,新数据被分配到它最有可能归属的类别,虚线箭头表示在计算概率时还有其他步骤。
比较线性回归(左)和逻辑回归(右)的预测概率
使用线性回归的预测概率会导致逻辑错误,而逻辑回归的预测值将始终介于0 和1 之间。
对比铜含量和真品的几率
从逻辑函数中得到的概率被转换成概率,并与铜含量作对比。概率可以取任何正值(左图);对左图的几率取自然对数,生成它们的对数概率,并将这些对数概率与铜含量绘制在一起,我们的预测变量和一幅画之间有线性关系(右图)。
简单逻辑回归
简单逻辑回归是逻辑回归的一种形式,通常用于处理只包含一个输入特征的二分类问题。在简单逻辑回归中,我们假设输入特征 (X) 与输出变量 (Y) 之间存在线性关系,并使用逻辑函数(Sigmoid函数)将线性组合转换为概率。
简单逻辑回归的模型可以表示为:
逻辑回归通过最小化损失函数来学习模型参数。对于简单逻辑回归,常用的损失函数是对数损失函数,其目标是最小化模型对观测样本的负对数似然。损失函数的表达式如下:
模型的训练过程涉及使用优化算法(例如梯度下降)来最小化损失函数,从而找到最优的参数 (b0) 和 (b1)。
简单逻辑回归常用于初步探索数据或具有单一影响因素的问题。当处理更复杂的问题时,可以考虑使用多变量逻辑回归,该模型包含多个输入特征。
model1 <- glm(Attrition ~ MonthlyIncome, family = "binomial", data = churn_train)
model2 <- glm(Attrition ~ OverTime, family = "binomial", data = churn_train)
churn_train2 <- churn_train %>% mutate(prob = ifelse(Attrition == "Yes", 1, 0))
churn_train2 <- broom::augment(model2, churn_train2) %>% mutate(.fitted = exp(.fitted))
p1 <- ggplot(churn_train2, aes(MonthlyIncome, prob)) +
geom_point(alpha = 0.15) +
geom_smooth(method = "glm", method.args = list(family = "binomial")) +
ggtitle("Predicted probabilities for model1") +
xlab("Monthly Income") +
ylab("Probability of Attrition")
p2 <- ggplot(churn_train2, aes(OverTime, .fitted, color = OverTime)) +
geom_boxplot(show.legend = FALSE) +
geom_rug(sides = "b", position = "jitter", alpha = 0.2, show.legend = FALSE) +
ggtitle("Predicted probabilities for model2") +
xlab("Over Time") +
scale_y_continuous("Probability of Attrition", limits = c(0, 1))
gridExtra::grid.arrange(p1, p2, nrow = 1)
####系数
exp(coef(model1))
exp(coef(model2))
confint(model1)
confint(model2)
tidy(model1)
tidy(model2)
多元逻辑回归
多元逻辑回归,也被称为多类别逻辑回归或Softmax回归,是逻辑回归的一种扩展形式,用于处理多个类别的分类问题。与二元逻辑回归不同,多元逻辑回归可以处理包含两个以上类别的情况。
- 模型表达式:
Softmax函数的表达式为:
- 训练过程:
训练多元逻辑回归模型的过程涉及最小化损失函数,通常使用交叉熵损失函数(cross-entropy loss)。该损失函数衡量模型的预测概率分布与实际类别之间的差异。
- 优化算法:
常用的优化算法包括梯度下降法和其变种,用于调整模型参数以最小化损失函数。
- 应用:
多元逻辑回归广泛应用于多类别分类问题,如手写数字识别、图像分类、自然语言处理中的词性标注等任务。在深度学习中,Softmax回归通常被用作神经网络输出层的激活函数,以进行多类别分类。
model3 <- glm(
Attrition ~ MonthlyIncome + OverTime,
family = "binomial",
data = churn_train
)
tidy(model3)
churn_train3 <- churn_train %>% mutate(prob = ifelse(Attrition == "Yes", 1, 0))
churn_train3 <- broom::augment(model3, churn_train3) %>% mutate(.fitted = exp(.fitted))
ggplot(churn_train3, aes(MonthlyIncome, prob, color = OverTime)) +
geom_point(alpha = .15) +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE) +
ggtitle("Predicted probabilities for model3") +
xlab("Monthly Income") +
ylab("Probability of Attrition")
评估模型精度
有了对逻辑回归的基本了解,类似于线性回归,我们现在要评估模型预测的好坏。我们使用caret::train()并拟合三个10 折交叉验证的逻辑回归模型。
set.seed(123)
cv_model1 <- train(
Attrition ~ MonthlyIncome,
data = churn_train,
method = "glm",
family = "binomial",
trControl = trainControl(method = "cv", number = 10)
)
set.seed(123)
cv_model2 <- train(
Attrition ~ MonthlyIncome + OverTime,
data = churn_train,
method = "glm",
family = "binomial",
trControl = trainControl(method = "cv", number = 10)
)
set.seed(123)
cv_model3 <- train(
Attrition ~ .,
data = churn_train,
method = "glm",
family = "binomial",
trControl = trainControl(method = "cv", number = 10)
)
# 提取样本外的性能指标
summary(
resamples(
list(
model1 = cv_model1,
model2 = cv_model2,
model3 = cv_model3
)
)
)$statistics$Accuracy
# 预测类
pred_class <- predict(cv_model3, churn_train)
# 创建混合矩阵
confusionMatrix(
data = relevel(pred_class, ref = "Yes"),
reference = relevel(churn_train$Attrition, ref = "Yes")
)
#install.packages("ROCR")
library(ROCR)
# 计算预测概率
m1_prob <- predict(cv_model1, churn_train, type = "prob")$Yes
m3_prob <- predict(cv_model3, churn_train, type = "prob")$Yes
# 计算 cv_model1 和 cv_model3 的 AUC 指标
perf1 <- prediction(m1_prob, churn_train$Attrition) %>%
performance(measure = "tpr", x.measure = "fpr")
perf2 <- prediction(m3_prob, churn_train$Attrition) %>%
performance(measure = "tpr", x.measure = "fpr")
# 绘制 cv_model1 和 cv_model3 的 ROC 曲线
plot(perf1, col = "black", lty = 2)
plot(perf2, add = TRUE, col = "blue")
legend(0.8, 0.2, legend = c("cv_model1", "cv_model3"),
col = c("black", "blue"), lty = 2:1, cex = 0.6)
交叉验证模型1 和3 的ROC 曲线。AUC 的增加代表我们使用模型3 实现的提升。
特征解释
与线性回归类似,一旦确定了我们首选的逻辑回归模型,我们就需要解释这些特征如何影响结果。与普通线性回归模型一样,逻辑回归模型的变量重要性。
cv_model3 模型的前20 个最重要的变量