1. 程式人生 > >R語言-邏輯回歸建模

R語言-邏輯回歸建模

sam 沒有 nes 參數 BE 數據 同時 fit days

案例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.數據集字段說明

 1 # SeriousDlqin2yrs 超過90天的逾期欠款
 2 # RevolvingUtilizationOfUnsecuredLines 無擔保貸款的循環利用,除了車,房除以信用額度的綜合的無分期債務的信用卡貸款
 3 # age 貸款人年齡
 4 # NumberOfTime30-59DaysPastDueNotWorse 30~59天逾期次數
 5 # DebtRatio 負債比例
 6 # MonthlyIncome 月收入
 7 # NumberOfOpenCreditLinesAndLoans 開放式和信貸的數量
 8 # NumberOfTimes90DaysLate 大於等於90天逾期的次數
 9 # NumberRealEstateLoansOrLines 不動產的數量
10 # NumberOfTime60-89DaysPastDueNotWorse 60~90天逾期次數
11 # 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%

R語言-邏輯回歸建模