R语言-逻辑回归建模
案例1:使用逻辑回归模型,预测客户的信用评级
数据集中采用defect为因变量,其余变量为自变量
1.加载包和数据集
library(pROC)
library(DMwR)
model.df <- read.csv('E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一天\\4信用评级\\customer defection data.csv',sep=',',header=T
2.查看数据集,
dim(model.df)
head(model.df)
str(model.df)
summary(model.df)
结论:一共有10000行数据,56个变量,其数据集中没有空值,但是有极大值存在
3,数据清洗
# 将Na的值补0
z <- model.df[,sapply(model.df, is.numeric)]
z[is.na(z)] = 0
summary(z) # 去掉客户id和defect列
exl <- names(z) %in% c('cust_id','defect')
z <- z[!exl]
head(z)
# 将极大值点和取99%分位,极小值取1%分位
qs <- sapply(z, function(z) quantile(z,c(0.01,0.99)))
system.time(for (i in 1:ncol(z)){
for( j in 1:nrow(z)){
if(z[j,i] < qs[1,i]) z[j,i] = qs[1,i]
if(z[j,i] > qs[2,i]) z[j,i] = qs[2,i]
}
})
# 重新构建数据集
model_ad.df <- data.frame(cust_id=model.df$cust_id,defect=model.df$defect,z)
boxplot(model_ad.df$visit_cnt)


修改前 修改后
结论:visit_cnt不再有不符合业务的极大值出现
4.建模
set.seed(123)
# 将数据集分成训练集和测试集,一般是(70%是训练集,30%是测试集)
s <- sample(nrow(model_ad.df),floor(nrow(model_ad.df)*0.7),replace = F)
train_df <- model_ad.df[s,]
test_df <- model_ad.df[-s,] # 去除掉cust_id
n <- names(train_df[-c(1,34)])
# 生成逻辑回归的公式
f <- as.formula(paste('defect ~',paste(n[!n %in% 'defect'],collapse = ' + ')))
# 建模
model_full <- glm(f,data=train_df[-c(1,34)],family = binomial)
summary(model_full)
# 模型检验direction 有三类参数both,backword,forward
# backword每次检验都减少一个因子,forword每次增加一个因子
# 同时AIC的值越小说明模型越好
step <- step(model_full,direction = 'both')
summary(step)
5.检验模型
# 使用测试集去预测模型
pred <- predict(step,test_df,type='response')
head(pred)
fitted.r <- ifelse(pred>0.5,1,0)
# 模型的精度
accuracy <- table(fitted.r,test_df$defect)
#做出roc的图像
roc <- roc(test_df$defect,pred)
roc
plot(roc)


结论:roc的值是0.75说明模型有较好的的预测功能,一般模型的准确率要达到75%左右,否则需要进行调整
案例2:研究哪类用户是不良用户
1.数据集字段说明
# SeriousDlqin2yrs 超过90天的逾期欠款
# RevolvingUtilizationOfUnsecuredLines 无担保贷款的循环利用,除了车,房除以信用额度的综合的无分期债务的信用卡贷款
# age 贷款人年龄
# NumberOfTime30-59DaysPastDueNotWorse 30~59天逾期次数
# DebtRatio 负债比例
# MonthlyIncome 月收入
# NumberOfOpenCreditLinesAndLoans 开放式和信贷的数量
# NumberOfTimes90DaysLate 大于等于90天逾期的次数
# NumberRealEstateLoansOrLines 不动产的数量
# NumberOfTime60-89DaysPastDueNotWorse 60~90天逾期次数
# NumberOfDependents 不包括本人的家属数量
2.导入数据集和包
library(pROC)
library(DMwR)
cs.df <- read.csv('E:\\Udacity\\Data Analysis High\\R\\R_Study\\第二天数据\\cs-data.csv',header=T,sep=',')
summary(cs.df)

结论:月收入这一栏出现的Na值较多
有一些值有异常值的存在,比如负债比,不动产数量,和家属成员数量,这些值会给模型带来不好的影响,所以要去除
3.数据清洗
# 使用knn邻近算法,补充缺失的月收入
cs.df_imp <- knnImputation(cs.df,k=3,meth = 'weighAvg')
#去除掉 30~60天逾期超过80的极大值
cs.df_imp <- cs.df_imp[-which(cs.df_imp$NumberOfTime30.59DaysPastDueNotWorse>80)]
# 去除掉负债比大于10000的极值
cs.df_imp <- cs.df_imp[-which(cs.df_imp$DebtRatio > 100000)]\
# 去除掉月收入大于50万的极值
cs.df_imp <- cs.df_imp[-which(cs.df_imp$MonthlyIncome > 500000)]
4.建模
set.seed(123)
# 将数据集分成训练集和测试集,防止过拟合
s <- sample(nrow(cs.df_imp),floor(nrow(cs.df_imp)*0.7),replace = F)
cs.train <- cs.df_imp[s,]
cs.test <- cs.df_imp[-s,]
# 使用逻辑线性回归生成全量模型
# family=binomia表示使用二项分布
# maxit=1000 表示需要拟合1000次
model_full <- glm(SeriousDlqin2yrs~.,data=cs.train,family=binomial,maxit=1000)
# 使用回归的方式找出最小的AIC的值
step <- step(model_full,direction='both')
summary(step)

结论:pr的值小于0.05的因子才是有效因子,*越多越重要
5.查看模型
pred <- predict(step,cs.test,type = 'response')
fitted.r <- ifelse(pred>0.5,1,0)
accuracy <- table(fitted.r,cs.test$SeriousDlqin2yrs)
misClasificError <- mean(fitted.r!=cs.test$SeriousDlqin2yrs)
roc <- roc(cs.test$SeriousDlqin2yrs,pred)
plot(roc)
roc


结论:预测的成功率只有69%
6.修改模型
6.1 查看数据集
table(cs.train$SeriousDlqin2yrs)
prop.table(table(cs.train$SeriousDlqin2yrs))

结论:只有6%左右的用户违约,说明数据集并不平衡
6.2 平衡结果
cs.train$SeriousDlqin2yrs <- as.factor(cs.train$SeriousDlqin2yrs)
# 采用bootstrasp自助抽样法,目的:减小0的个数,增加1的个数,再平衡模型
trainSplit <- SMOTE(SeriousDlqin2yrs~.,cs.train,perc.over = 30,perc.under = 550)
cs.train$SeriousDlqin2yrs <- as.numeric(cs.train$SeriousDlqin2yrs)
prop.table(table(trainSplit$SeriousDlqin2yrs))

结论:数据集的分布达到了基本平衡
6.3 重新建模
model_full = glm(SeriousDlqin2yrs~.,data=trainSplit,family=binomial,maxit=1000) step = step(model_full,direction = "both")
summary(step)

结论:找到了8个对结果有影响的变量,不同于开始建模的变量选择
6.4 预测模型
pred = predict(step,cs.test,type="response") fitted.r=ifelse(pred>0.5,1,0)
accuracy = table(fitted.r,cs.test$SeriousDlqin2yrs) misClasificError = mean(fitted.r!=cs.test$SeriousDlqin2yrs) roc = roc(cs.test$SeriousDlqin2yrs,pred)
plot(roc)
roc


结论:模型预测的精度从69%提升到了81.6%
数据集:https://github.com/Mounment/R-Project
R语言-逻辑回归建模的更多相关文章
- 用R做逻辑回归之汽车贷款违约模型
数据说明 本数据是一份汽车贷款违约数据 application_id 申请者ID account_number 账户号 bad_ind 是否违约 vehicle_year ...
- 含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解
版权声明:本文为博主原创文章,博客地址:,欢迎大家相互转载交流. 使用R语言做逻辑回归的时候,当自变量中有分类变量(大于两个)的时候,对于回归模型的结果有一点困惑,搜索相关知识发现不少人也有相同的疑问 ...
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
- Spark LogisticRegression 逻辑回归之建模
导入包 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Dataset import org.apache.s ...
- 逻辑回归应用之Kaggle泰坦尼克之灾(转)
正文:14pt 代码:15px 1 初探数据 先看看我们的数据,长什么样吧.在Data下我们train.csv和test.csv两个文件,分别存着官方给的训练和测试数据. import pandas ...
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
作者:寒小阳 && 龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49797143 ht ...
- 逻辑回归应用之Kaggle泰坦尼克之灾
机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾 标签: 机器学习应用 2015-11-12 13:52 3688人阅读 评论(15) 收藏 举报 本文章已收录于: 机器学习知识库 分类 ...
- python__画图表可参考(转自:寒小阳 逻辑回归应用之Kaggle泰坦尼克之灾)
出处:http://blog.csdn.net/han_xiaoyang/article/details/49797143 2.背景 2.1 关于Kaggle 我是Kaggle地址,翻我牌子 亲,逼格 ...
- 机器学习入门11 - 逻辑回归 (Logistic Regression)
原文链接:https://developers.google.com/machine-learning/crash-course/logistic-regression/ 逻辑回归会生成一个介于 0 ...
随机推荐
- TI AM335X处理器介绍
AM335X是美国TI(德州仪器)公司基于 ARM Cortex-A8内核的AM335X微处理器,在图像.图形处理.外设方面进行了增强,并全面支持诸如 EtherCAT 和 PROFIBUS等工业接口 ...
- 【原】Java学习笔记027 - 泛型
package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...
- web开发中对缓存的使用
很久没有发表随笔了,最近工作不是太忙,抽点时间 给大家谈谈缓存吧 ; 在我从事web开发的几年实践中 接触了缓存技术 也是比较多的,在最初的 项目当中 我们用到 hibernate 的 一二级缓存, ...
- C# Coding Conventions(译)
C# Coding Conventions C#编码规范 Naming Conventions 命名规范Layout Conventions 布局规范Commenting Conventions 注释 ...
- C# Hook原理及EasyHook简易教程
前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实际上,Windows平台是基于事件驱动机制的, ...
- Bzoj4566:[HAOI2016]找相同字符
题面 Bzoj Sol 两个串拼在一起后求出后缀数组 然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\) 又由于扫的时候是对\(height\)取\(min\) 那么可以用单调栈维护每一段的贡 ...
- Angular和Vue.js 深度对比
Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强.如今,已有许多开发人员开始使用 Vue ...
- Python可视化库-Matplotlib使用总结
在做完数据分析后,有时候需要将分析结果一目了然地展示出来,此时便离不开Python可视化工具,Matplotlib是Python中的一个2D绘图工具,是另外一个绘图工具seaborn的基础包 先总结下 ...
- 关于Android attrs 自定义属性的说明
写个自定义控件时经常要自定义一些自己的属性,平时用的都是那几个,今天就顺便一起总结一下这个东东吧- 一.定义:属性的定义都在attrs.xml文件里面: 二.读取:通过都是通过TypedArray去读 ...
- error:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
问题:同样的代码,只能插入一组值,第二组值插入不了 解决:开始我将app_id作为主键,但很明显,同一个app_id会有不同的index,而同一个index也可能对应不同的app_id,因此只能添加一 ...