逻辑回归算法实现_基于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

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

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11710984.html

时间: 2024-12-13 01:51:55

逻辑回归算法实现_基于R语言的相关文章

机器学习-K-means聚类及算法实现(基于R语言)

K-means聚类 将n个观测点,按一定标准(数据点的相似度),划归到k个聚类(用户划分.产品类别划分等)中. 重要概念:质心 K-means聚类要求的变量是数值变量,方便计算距离. 算法实现 R语言实现 k-means算法是将数值转换为距离,然后测量距离远近进行聚类的.不归一化的会使得距离非常远. 补充:scale归一化处理的意义 两个变量之间数值差别太大,比如年龄与收入的数值差别就很大. 步骤 第一步,确定聚类数量,即k的值 方法:肘部法则+实际业务需求 第二步,运行K-means模型 第三

SparkMLlib学习分类算法之逻辑回归算法

SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693836) 逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族,差异主要在于变量不同,因此其解法与生成曲线也不尽相同.逻辑回归是无监督学习的一个重要算法,对某些数据与事物的归属(分到哪个类别)及可能性(分到某一类别的概率)进行评估. (二),SparkMLlib逻辑回归应用

Spark MLlib Logistic Regression逻辑回归算法

1.1 逻辑回归算法 1.1.1 基础理论 logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测.g(z)可以将连续值映射到0和1上. 它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为"可能性"才能说服广大民众.当然了,把大值压缩到这个范围还有个很好的好处,就是可以消除特别冒尖的变量的影响. Logistic函数(或称为Sigm

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

4.机器学习之逻辑回归算法

理论上讲线性回归模型既可以用于回归,也可以用于分类.解决回归问题,可以用于连续目标值的预测.但是针对分类问题,该方法则有点不适应,因为线性回归的输出值是不确定范围的,无法很好的一一对应到我们的若干分类中.即便是一个二分类,线性回归+阈值的方式,已经很难完成一个鲁棒性很好的分类器了.为了更好的实现分类,逻辑回归诞生了.逻辑回归(Logistic Regression)主要解决二分类问题,用来表示某件事情发生的可能性.逻辑回归是假设数据服从Bernoulli分布的,因此LR也属于参数模型,他的目的也

21-城里人套路深之用python实现逻辑回归算法

如果和一个人交流时,他的思想像弹幕一样飘散在空中,将是怎样的一种景象?我想大概会毫不犹豫的点关闭的.生活为啥不能简单明了?因为太直白了令人乏味.保留一些不确定性反而扑朔迷离,引人入胜.我们学习了线性回归,对于损失函数及权重更新公式理解起来毫无压力,这是具体直白的好处.然而遇到抽象晦涩的逻辑回归,它的损失函数及权重更新公式就经历了从p(取值范围0~1)->p/(1-p)(取值范围0~+oo)->z=log(p/(1-p))(取值范围-oo~+oo)->p=1/1+e^(-z)->极大

(7) 逻辑回归算法

逻辑回归算法原理推导 逻辑回归,虽然叫回归,但还是一个分类算法  逻辑回归求解 原文地址:https://www.cnblogs.com/traditional/p/9385259.html

分享《深度学习精要(基于R语言)》+PDF+源码+Joshua F.Wiley+高蓉

下载:https://pan.baidu.com/s/14UlxD5VJRY92UpP7Wr6Taw 更多最新的资料:http://blog.51cto.com/14087171 <深度学习精要(基于R语言)>高清中文版PDF+高清英文版PDF+源代码 高清中文版PDF,带目录和书签,能够复制粘贴:高清英文版PDF,带目录和书签,能够复制粘贴:中英文两版可以对比学习. 配套源代码: 经典书籍,讲解详细: 其中高清中文版如图 原文地址:http://blog.51cto.com/14087171

逻辑回归算法-通俗易懂易实现

转自https://www.cnblogs.com/hum0ro/p/9652674.html,看到介绍的逻辑回归很容易理解算法原理及实现,拿来存档做记录 一直做图像处理算法和视频方面的嵌入式应用软件,早起研究和应用过神经网络算法,一直没有了解其他分类的机器学习算法,这段时间用空学习研究这些算法,如k-means,em聚类算法,查阅了许多资料,算法推倒的,结合举例说明有个直观印象,这样可以更好地理解算法,方便实现 1.什么是逻辑回归 在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的