R语言实现Logistic回归的五折交叉验证

最近做作业的时候需要做Logistic回归的交叉验证,这里记录一下

首先对数据集进行拆分,这里用到caret包里的函数
拆分数据
然后对其进行交叉验证+logistic回归
交叉验证

 library(plyr)
library(caret)
folds <- createFolds(y=bank_logit$y.yes,k=5)
length(folds)
 print("***组号***")
 train_cv <- bank_logit[-folds[[i]],]
 test_cv <- bank_logit[folds[[i]],]
 #summary(test_cv)
 #生成logis模型,用glm函数
 #用训练集数据生成logis模型,用glm函数
 #family:每一种响应分布(指数分布族)允许各种关联函数将均值和线性预测器关联起来。常用的family:binomal(link='logit')--响应变量服从二项分布,连接函数为logit,即logistic回归
 pre <- glm(y.yes ~.,family=binomial(link = "logit"),data = train_cv)
 #summary(pre)
 #测试集的真实值
 real <- test_cv$y.yes
 #predict函数可以获得模型的预测值。这里预测所需的模型对象为pre,预测对象newdata为测试集,预测所需类型type选择response,对响应变量的区间进行调整
 predict.pre <- predict(pre,type='response',newdata=test_cv)
 #按照预测值为1的概率,>0.5的返回1,其余返回0
 predict =ifelse(predict.pre>0.5,1,0)
 #数据中加入预测值一列
 test_cv$predict = predict
 
 ##模型检验
 res <- data.frame(real,predict)
 #训练数据的行数,也就是样本数量
 n = nrow(test_cv)      
 #计算Cox-Snell拟合优度
 R2 <- 1-exp((pre$deviance-pre$null.deviance)/n)    
 cat("Cox-Snell R2=",R2,"\n")
 #计算Nagelkerke拟合优度,我们在最后输出这个拟合优度值
 R2<-R2/(1-exp((-pre$null.deviance)/n))  
 cat("Nagelkerke R2=",R2,"\n")
 ##模型的其他指标
 #residuals(pre)     #残差
 #coefficients(pre)  #系数,线性模型的截距项和每个自变量的斜率,由此得出线性方程表达式。或者写为coef(pre)
 #anova(pre)         #方差
 
 true_value=test_cv[,"y.yes"]
 predict_value=test_cv[,"predict"]
 #计算模型精确度
 error = predict_value-true_value
 accuracy = (nrow(test_cv)-sum(abs(error)))/nrow(test_cv) #精确度--判断正确的数量占总数的比例
 #计算Precision,Recall和F-measure
 #一般来说,Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了
 #和混淆矩阵结合,Precision计算的是所有被检索到的item(TP+FP)中,"应该被检索到的item(TP)”占的比例;Recall计算的是所有检索到的item(TP)占所有"应该被检索到的item(TP+FN)"的比例。
 precision=sum(true_value & predict_value)/sum(predict_value)  #真实值预测值全为1 / 预测值全为1 --- 提取出的正确信息条数/提取出的信息条数
 recall=sum(predict_value & true_value)/sum(true_value)  #真实值预测值全为1 / 真实值全为1 --- 提取出的正确信息条数 /样本中的信息条数
 #P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)
 F_measure=2*precision*recall/(precision+recall)    #F-Measure是Precision和Recall加权调和平均,是一个综合评价指标
 #输出以上各结果
 print(accuracy)
 print(precision)
 print(recall)
 print(F_measure)
 #混淆矩阵,显示结果依次为TP、FN、FP、TN
 table(true_value,predict_value)         
 #ROC曲线
 # 方法1
 #install.packages("ROCR")  
 library(ROCR)     
 pred <- prediction(predict.,true_value)   #预测值(0.5二分类之前的预测值)和真实值   
 performance(pred,'auc')@y.values        #AUC值
 perf <- performance(pred,'tpr','fpr')
 dev.new()
 plot(perf)

你可能感兴趣的:(R语言实现Logistic回归的五折交叉验证)