R语言实现逻辑回归模型

简介: 首先,本章节使用到的数据集是ISLR包中的Default数据集,数据包含客户信息的模拟数据集。这里的目的是预测哪些客户将拖欠他们的信用卡债务,这个数据集有1w条数据,3个特征

首先,本章节使用到的数据集是ISLR包中的Default数据集,数据包含客户信息的模拟数据集。这里的目的是预测哪些客户将拖欠他们的信用卡债务,这个数据集有1w条数据,3个特征:

library("ISLR")
library("tibble")
as_tibble(Default)
## # A tibble: 10,000 x 4
##    default student balance income
##    <fct>   <fct>     <dbl>  <dbl>
##  1 No      No         730. 44362.
##  2 No      Yes        817. 12106.
##  3 No      No        1074. 31767.

这里需要分析的是学生身份,信用卡余额,收入这三个特征对违约进行适当的一个分类。


数据探索


拿到数据的第一步还是需要对于数据进行了解。了解的方面包括数据的质量,数据的分布,以及数据之间的关系。密度图可用于识别预测变量相对于彼此的分布以及响应变量,使用ggplot2绘制关于balance特征密度直方图,如图1。

library(ggplot2)
ggplot(data = Default,aes(x = balance,color = default))+geom_density()+labs(title = "default with balance")

6EP08)]WK`TTSMHPHLA[V%D.png图1 balance的分布

图1描述的违约,不违约两种情况下信用卡余额的分布,从图中可以看出,这两种情况下收入的分布是不一样的。说明这两群人的信用卡余额是不一样的,也就是说,收入对于是否是违约者有很好的区分能力。然后绘制income特征的密度直方图,结果如图2。

ggplot(data = Default,aes(x = income,color = default))+geom_density()+labs(title = "default with income")


54$AZ5~`FM%MJ2D%]Y@3}}0.png

图2 income的分布

从图2中,观察到的是否违约两个群体间的收入分布差异不大,可能认为收入对我们的模型不是特别有用。另一方面,对于是否违约,平均收入在1400左右的值上分布似乎存在很大差异。绘制incomestudent特征的密度直方图,结果如图3。

library(ggplot2)
ggplot(data = Default,aes(x = income,color = student))+geom_density()+labs(title = "student with income")

image.gifE`[Z]{WSK0]XMGMZC11)$YM.png

图3  income与是否是学生之间的关系

从图3中还可以观察收入和平衡与其他预测学生的分布 这些密度图表明学生的收入远低于其他人口。


构建逻辑回归模型


虽然我们可以做更多的数据探索,但是对于这份数据已经足够了,接下来可以创建逻辑回归模型。为了实现良好的建模实践,将创建训练和测试拆分,以避免在执行回归时过度拟合,下面的代码首先划分了数据集合,一半的数据集为训练集合,一般的结合为测试集合,然后构建逻辑回归模型,使用的是glm构建逻辑回归模型,逻辑回归模型中,使用default特征作为因变量,数据集中所有的其他特征作为自变量。

# Split into train/test splits first.
set.seed(42)
default_idx <- sample(nrow(Default), ceiling(nrow(Default) / 2))
default_trn <-  Default[default_idx, ]
default_tst <- Default[-default_idx, ]
# Create the model.
model_glm <- glm(default ~ ., data = default_trn, family = "binomial")

创建逻辑回归模型应该与创建线性回归模型非常相似。但是,我们使用glm()代替lm()。另请注意,我们必须为二进制分类上指定family =“binomial”。(实际上,用family =“gaussian”调用glm()将等同于lm()然后使用summary函数用于查看逻辑回归的详细信息。

summary(model_glm)
## 
## Call:
## glm(formula = default ~ ., family = "binomial", data = default_trn)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.4137  -0.1496  -0.0596  -0.0214   3.7295  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.026e+01  6.852e-01 -14.976  < 2e-16 ***
## studentYes  -1.010e+00  3.248e-01  -3.109  0.00188 ** 
## balance      5.663e-03  3.252e-04  17.412  < 2e-16 ***
## income      -8.386e-06  1.139e-05  -0.736  0.46152    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1470.42  on 4999  degrees of freedom
## Residual deviance:  813.19  on 4996  degrees of freedom
## AIC: 821.19
## 
## Number of Fisher Scoring iterations: 8

与为线性回归模型计算的summary结果一样,将获得有关残差相关的信息,以及预测变量的显着性估计,logisitic回归框架中p值的解释与线性回归模型的p值相同。

但请注意,逻辑回归模型得到的是z值而不是t值。在没有过多地理解这种差异的理论的情况下,应该理解这个值的这个含义类似于t值的含义。另外,从结果中可以看到看到Null偏差(Null deviance),AIC和Fisher Scoring迭代次数,而不是剩余标准误差,Multipe R平方,调整R平方和F统计量。

summary() 调用生成的逻辑回归诊断值通常不直接用于解释模型的“拟合优度”。

在进行任何预测之前,让我们用summary()简要检查模型。除其他外,重要的是要看看我们的模型估计了哪些系数值。


逻辑回归进行预测


但是,在更仔细地研究更适合于逻辑回归的模型诊断之前,首先应该了解如何使用带有glm()的predict()函数。为了返回概率,我们必须指定type =“response”。

head(predict(model_glm, type = "response"))
##         9149         9370         2861         8302         6415 
## 9.572703e-04 4.550820e-01 9.532154e-03 3.281078e-05 1.214581e-04 
##         5189 
## 2.968213e-04

如前所述,这些预测值是可能性,而不是分类。我们必须“手动”将概率转换为分类。传统上,诸如0.5的中点值用于“分类”概率。(这实际上等于指定type =“link”并使用阈值0),使用ifesle将所有预测值大于0.5的结果记为Yes,小于等于0.5的结果记为No。

trn_pred <- ifelse(predict(model_glm, type = "response") > 0.5, "Yes", "No")
head(trn_pred)
## 9149 9370 2861 8302 6415 5189 
## "No" "No" "No" "No" "No" "No"


逻辑回归模型评估


评估分类模型最常见的事情可能是使用交叉表将实际响应值与预测响应值进行比较,交叉表通常称为混淆矩阵。可以使用basetable()函数生成此矩阵。

trn_tab <- table(predicted = trn_pred, actual = default_trn$default)
trn_tab
##          actual
## predicted   No  Yes
##       No  4814  121
##       Yes   18   47
# Making predictions on the test set.
tst_pred <- ifelse(predict(model_glm, newdata = default_tst, type = "response") > 0.5, "Yes", "No")
tst_tab <- table(predicted = tst_pred, actual = default_tst$default)
tst_tab
##          actual
## predicted   No  Yes
##       No  4815  111
##       Yes   20   54

也许不足为奇的是,评估逻辑回归模型的最常见指标是错误率和准确度(这只是错误率的加性倒数),可以直接从confustion矩阵计算这些指标,下面编写了一个函数,用于计算模型的错误率。

calc_class_err <- function(actual, predicted) {
  mean(actual != predicted)
}
calc_class_err(actual = default_trn$default, predicted = trn_pred)
## [1] 0.0278
calc_class_err(actual = default_tst$default, predicted = tst_pred)
## [1] 0.0262

J%_H]9I(}CDPK_ED2JJX3Z2.png

表1 混淆矩阵

现在,我们现在更详细地考虑混淆矩阵。名称真阳性(TP),真阴性(TN),假阳性(FP)和假阴性(FN)通常用于参考燃烧矩阵的四个细胞。

{~0@HGQ({2Z96FZEX1ES3YN.png

从混淆矩阵导出诸如灵敏度,特异性和普遍性的度量的计算。这些(和其他)度量的重要性取决于数据的性质(例如,如果认为数据难以预测,则较低的值可能是可接受的),以及对错误分类类型的容忍度。例如,我们可能希望偏向我们对默认值进行分类的预测,以便我们更有可能在未发生默认值时预测默认值。我们必须仔细确定我们是否要优先考虑敏感性或特异性。

我们可以使用caret包中的confusionMatrix()函数轻松获得灵敏度,特异性等值。

library("caret")
## Loading required package: lattice
confusionMatrix(trn_tab, positive = "Yes")
## Confusion Matrix and Statistics
## 
##          actual
## predicted   No  Yes
##       No  4814  121
##       Yes   18   47
##                                           
##                Accuracy : 0.9722          
##                  95% CI : (0.9673, 0.9766)
##     No Information Rate : 0.9664          
##     P-Value [Acc > NIR] : 0.01101         
##                                           
##                   Kappa : 0.392           
##  Mcnemar's Test P-Value : < 2e-16         
##                                           
##             Sensitivity : 0.2798          
##             Specificity : 0.9963          
##          Pos Pred Value : 0.7231   
##          Neg Pred Value : 0.9755          
##              Prevalence : 0.0336          
##          Detection Rate : 0.0094          
##    Detection Prevalence : 0.0130          
##       Balanced Accuracy : 0.6380          
##                                           
##        'Positive' Class : Yes             
##

现在,让我们考虑另一个与混淆矩阵无关的度量。还记得我们选择0.5作为分类门槛的地方吗?我们怎么知道0.5值是准确度的“最佳”值。实际上,其他门槛值可能更好(如果所有模型假设都为真并且样本量相当大,则0.5将倾向于最佳值)。

ROC曲线说明了所有可能的门槛值的灵敏度和特异性。我们可以使用pROC包中的roc()函数为的预测生成ROC曲线,roc()函数的第一个参数是数据集的真实标签,第二个参数是模型的预测结果,第三个参数plot需要输入一个逻辑值,用以表明是否需要绘制ROC曲线图。图3是模型的ROC曲线。

library("pROC")
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
test_prob <- predict(model_glm, newdata = default_tst, type = "response")
test_roc <- roc(default_tst$default , test_prob, plot = TRUE, print.auc = TRUE)

RH{ZXGX51L12IIR34[K}0QO.png

图4  ROC曲线图

as.numeric(test_roc$auc)
## [1] 0.9519489

一般来说,希望曲线靠向左边界和上边界(表明高灵敏度和特异性)。AUC(曲线下面积)用于量化ROC的轮廓,从图4中可以看到,AUC的值为0.952,模型效果很不错。

目录
相关文章
|
6月前
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
|
6月前
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
|
2月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
3月前
|
机器学习/深度学习 资源调度 算法
R语言逻辑回归与分类模型的深度探索与应用
【8月更文挑战第31天】逻辑回归作为一种经典的分类算法,在R语言中通过`glm()`函数可以轻松实现。其简单、高效且易于解释的特点,使得它在处理二分类问题时具有广泛的应用价值。然而,值得注意的是,逻辑回归在处理非线性关系或复杂交互作用时可能表现不佳,此时可能需要考虑其他更复杂的分类模型。
|
3月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
3月前
|
机器学习/深度学习 数据采集
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分类分析预测房价及交叉验证
上述介绍仅为简要概述,每个模型在实施时都需要仔细调整与优化。为了实现高度精确的预测,模型选择与调参是至关重要的步骤,并且交叉验证是提升模型稳健性的有效途径。在真实世界的房价预测问题中,可能还需要结合地域经济、市场趋势等宏观因素进行综合分析。
69 3
|
6月前
【R语言实战】——Logistic回归模型
【R语言实战】——Logistic回归模型
|
6月前
|
数据可视化
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码2
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码
|
6月前
|
数据可视化 数据挖掘
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码1
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码
|
6月前
|
前端开发 数据可视化
R语言广义线性混合模型(GLMM)bootstrap预测置信区间可视化
R语言广义线性混合模型(GLMM)bootstrap预测置信区间可视化

热门文章

最新文章