逻辑回归算法实现_基于R语言

Posted sanxiandoupi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归算法实现_基于R语言相关的知识,希望对你有一定的参考价值。

逻辑回归(Logistic Regression)模型和线性回归非常相似,可以说就是在逻辑回归的基础上加上了一步逻辑转换,也就是因为这个转换,使逻辑回归模型非常适用于二分类问题的概率预测。本文主要详述逻辑回归模型的基础以及逻辑回归模型的R语言实现。

一、逻辑回归模型原理

首先要讲一下线性回归在预测分类事件中的缺点:线性回归模型的泛化能力很差,如果训练集存在噪点,会导致模型的结果特别差,不同样本建立起来的模型分割点不同;下图中根据年龄预测是否成年的分类问题,斜线就是根据训练集拟合出来的线性回归模型,横线就是该模型的分割点,可以看出,由于有异常值的存在,导致第二个线性回归模型的分割点发生了变动。
技术图片
技术图片
另外,线性回归模型的取值可以取到无穷小或者无穷大,不符合而分类问题的取值要在[0,1]中间,所以在分类问题中就需要对线性回归模型的结果进行转化,而所用的转化函数就是Sigmoid函数。

$$
S(x)=frac{1}{1+e^{-x}}
$$

下图就是上述线性回归模型经过sigmod函数转变之后,取值范围就变成了[0,1],同时模型在分裂点(x=0)区域特别敏感,在x>>0或者x<<0都不是特别敏感,这样就避免了噪点带来的影响,分割概率稳定在0.5附近。
技术图片
sigmoid函数的S(x)即为我们所预测的分类事件发生的概率P,为了和线性回归模型的形式一致,我们可以通过sigmoid的反函数来展现逻辑回归的方程,sigmoid的反函数就是我们所说的logit变换公式:

$$
S^{-1}(x)=ln(frac{p(x)}{1-p(x)})
$$
$$
Odds=frac{p(x)}{1-p(x)}
$$
其中P(x)是分类事件发生的概率,取对数的部分就是我们平常说的Odds Ratios(优势比),这个指标表示的是一个事件发生的概率与该事件不发生概率的比值,当Odds=1的时候说明,这个事件发生的概率和不发生的概率相同,都为50%。

综上,逻辑回归模型的形式为:
$$
ln(frac{p(x)}{1-p(x)})=alpha _1x_1+alpha _2x_2+…+beta
$$
求得分类事件发生的概率为:
$$
P(x)=frac{1}{1+e^{-({alpha _1x_1+alpha _2x_2+…+beta})}}
$$

二、逻辑回归模型R语言实现

accepts<-read.csv("accepts.csv")

读取数据,accepts是一个汽车贷款违约纪录的一个数据集,字段说明如下:

名称 中文含义
application_id 申请者ID
account_number 帐户号
bad_ind 是否违约
vehicle_year 汽车购买时间
vehicle_make 汽车制造商
bankruptcy_ind 曾经破产标识
tot_derog 五年内信用不良事件数量(比如手机欠费消号)
tot_tr 全部帐户数量
age_oldest_tr 最久账号存续时间(月)
tot_open_tr 在使用帐户数量
tot_rev_tr 在使用可循环贷款帐户数量(比如信用卡)
tot_rev_debt 在使用可循环贷款帐户余额(比如信用卡欠款)
tot_rev_line 可循环贷款帐户限额(信用卡授权额度)
rev_util 可循环贷款帐户使用比例(余额/限额)
fico_score FICO打分
purch_price 汽车购买金额(元)
msrp 建议售价
down_pyt 分期付款的首次交款
loan_term 贷款期限(月)
loan_amt 贷款金额
ltv 贷款金额/建议售价*100
tot_income 月均收入(元)
veh_mileage 大专栏  逻辑回归算法实现_基于R语言="text-align:left">行使历程(Mile)
used_ind 是否使用
weight 样本权重

剔除样本中的缺失值

accepts<-na.omit(accepts)

将目标变量转变为因子形式

accepts$bad_ind<-as.factor(accepts$bad_ind)

分割训练集和测试集

select<-sample(1:nrow(accepts),length(accepts$application_id)*0.7)
train=accepts[select,]
test=accepts[-select,]

建立逻辑回归模型

lg<-glm(bad_ind~fico_score+bankruptcy_ind+tot_derog+age_oldest_tr+rev_util+ltv+veh_mileage,family = binomial(link = 'logit'))

打印出模型的描述:发现有个变量P值检验未通过

> summary(lg)

Call:
glm(formula = bad_ind ~ fico_score + bankruptcy_ind + tot_derog + 
    age_oldest_tr + rev_util + ltv + veh_mileage, family = binomial(link = "logit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5219  -0.6763  -0.4425  -0.2180   3.0337  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)      5.254e+00  7.914e-01   6.639 3.17e-11 ***
fico_score      -1.373e-02  1.121e-03 -12.244  < 2e-16 ***
bankruptcy_indY -5.487e-01  1.906e-01  -2.878   0.0040 ** 
tot_derog        3.744e-02  1.591e-02   2.353   0.0186 *  
age_oldest_tr   -3.498e-03  6.139e-04  -5.699 1.21e-08 ***
rev_util         1.249e-03  5.850e-04   2.135   0.0328 *  
ltv              3.002e-02  3.407e-03   8.812  < 2e-16 ***
veh_mileage      4.708e-07  1.440e-06   0.327   0.7436    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 3011.9  on 3046  degrees of freedom
Residual deviance: 2550.3  on 3039  degrees of freedom
AIC: 2566.3

Number of Fisher Scoring iterations: 5

R语言为逻辑回归模型提供了三种变量筛选方法:

  • 向前引入法( direction=”forward”):刚开始没有变量,之后逐个把相关的变量放到模型中
  • 向后剔除法(direction =”backward”):刚开始全部变量,之后逐个把不相关的变量剔除出去
  • 逐步回归法(direction =”both”):结合上面两种方法

这里我们使用逐步回归法来做变量筛选,最后之前P值检验没通过的veh_mileage被剔除了

lg_ms <- step(lg,direction="both")
> summary(lg_ms)

Call:
glm(formula = bad_ind ~ fico_score + bankruptcy_ind + tot_derog + 
    age_oldest_tr + rev_util + ltv, family = binomial(link = "logit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5179  -0.6775  -0.4410  -0.2164   3.0326  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)      5.2653435  0.7907636   6.659 2.77e-11 ***
fico_score      -0.0137435  0.0011197 -12.275  < 2e-16 ***
bankruptcy_indY -0.5501408  0.1905979  -2.886   0.0039 ** 
tot_derog        0.0375763  0.0159036   2.363   0.0181 *  
age_oldest_tr   -0.0035001  0.0006140  -5.701 1.19e-08 ***
rev_util         0.0012479  0.0005844   2.135   0.0327 *  
ltv              0.0301192  0.0033946   8.873  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 3011.9  on 3046  degrees of freedom
Residual deviance: 2550.4  on 3040  degrees of freedom
AIC: 2564.4

Number of Fisher Scoring iterations: 5

检查各变量是否存在多重共线性的问题,可以看到各变量vif都小于10,不存在多重共线性情况

> vif(lg_ms)
    fico_score bankruptcy_ind      tot_derog  age_oldest_tr       rev_util            ltv 
      1.336987       1.156350       1.433134       1.077136       1.044721       1.042412 

用测试集检验模型,并画出ROC曲线 ,可以得到AUC为0.778,最优分割点为0.205

test$lg_p<-predict(lg_ms,test)
test$p<-(1/(1+exp(-1*test$lg_p)))
plot(roc(test$bad_ind,test$p), print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
     grid.col=c("green", "red"), max.auc.polygon=TRUE,
     auc.polygon.col="skyblue", print.thres=TRUE)

技术图片

对测试集做出预测,同时生成混淆矩阵

test$out<-1
test[test$p<0.205,]$out<-0
confusionMatrix(test$out,test$bad_ind,positive='1')

结果如下

> confusionMatrix(test$out,test$bad_ind,positive='1')
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 738  62
         1 335 172

               Accuracy : 0.6963          
                 95% CI : (0.6705, 0.7211)
    No Information Rate : 0.821           
    P-Value [Acc > NIR] : 1               

                  Kappa : 0.2904          
 Mcnemar's Test P-Value : <2e-16          

            Sensitivity : 0.7350          
            Specificity : 0.6878          
         Pos Pred Value : 0.3393          
         Neg Pred Value : 0.9225          
             Prevalence : 0.1790          
         Detection Rate : 0.1316          
   Detection Prevalence : 0.3879          
      Balanced Accuracy : 0.7114          

       'Positive' Class : 1     

版权声明:本文为大枫原创文章,转载请注明来源。

以上是关于逻辑回归算法实现_基于R语言的主要内容,如果未能解决你的问题,请参考以下文章

利用R语言+逻辑回归实现自动化运营

R语言基本数据分析

R语言基于Bagging分类的逻辑回归(Logistic Regression)决策树森林分析心脏病患者

逻辑回归 算法推导与基于Python的实现详解

数据分享|R语言逻辑回归Naive Bayes贝叶斯决策树随机森林算法预测心脏病|附代码数据

数据分享|R语言逻辑回归Naive Bayes贝叶斯决策树随机森林算法预测心脏病|附代码数据