逻辑回归算法实现_基于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
版权声明:本文为大枫原创文章,转载请注明来源。
相关推荐
theta = np.zeros #theta = array,构造全为零的行向量。grad[0,j] = np.sum/len #∑term / m. return value > threshol