R語言-邏輯回歸建模
阿新 • • 發佈:2018-03-30
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語言-邏輯回歸建模