这篇日志也确实是有感而发,我对R不熟悉,但实验需要,所以简单学了一下。发现无论是网上无数的教程,还是书本上的示例,在讲Logistic Regression的时候就是给一个简单的函数及输出结果说明。从来都没有讲清楚几件事情:
1. 怎样用训练数据训练模型,然后在测试数据上进行验证(测试数据和训练数据可能有重合)?
2. 怎样计算预测的效果,也就是计算Recall,Precision,F-measure等值?
3. 怎样计算Nagelkerke拟合优度等评价指标?
2014年9月8日补充:还有一个问题忘记说了,怎么样确定Logistic Regression的阈值,对于下面这段代码来讲,很简单:调整0.5为其他值即可。
发现这些书本和一些写博客的朋友,脑子真是不清楚得可以。去看你的教程,不是光看看简单的函数使用,或者听你讲讲原理,还是希望能尽快并且正确地用起来。从我的经历来看,已有的网上教程都做得太差了。
这里我也不详细介绍过程了,贴上有详细注释的代码,相信大家一看就明白:
rm(list=ls(all=TRUE))#首先删除工作空间中所有对象 training=read.csv("training.csv",header=FALSE) testing=read.csv("testing.csv",header=FALSE)#分别导入训练和测试数据 glm.fit=glm(V16~V7,data=training,family=binomial(link="logit"))#用训练数据生成模型,这里我是用第7列数据预测第16列 n=nrow(training)#训练数据的行数,也就是样本数量 R2<-1-exp((glm.fit$deviance-glm.fit$null.deviance)/n)#计算Cox-Snell拟合优度 cat("Cox-Snell R2=",R2,"\n") R2<-R2/(1-exp((-glm.fit$null.deviance)/n))#计算Nagelkerke拟合优度,我们在最后输出这个拟合优度值 p=predict(glm.fit,testing)#用模型对测试数据进行预测 p=exp(p)/(1+exp(p))#计算因变量的值 testing$V16_predicted=1*(p>0.5)#给test数据增加一列,也就是对V16的预测,当p>0.5时,预测值为1 true_value=testing[,16] predict_value=testing[,17]#分别将16和17列取出来 retrieved=sum(predict_value) precision=sum(true_value & predict_value)/retrieved recall=sum(predict_value & true_value)/sum(true_value) F_measure=2*precision*recall/(precision+recall)#计算Recall,Precision和F-measure #补充一点:对TPR(True Positive Rate)和FPR(False Positive Rate)的计算: TPR=sum(true_value & predict_value)/sum(true_value)#实际上和Recall相等 FPR=(sum(predict_value)-sum(true_value & predict_value))/(length(true_value)-sum(true_value)) summary(glm.fit) cat("Nagelkerke R2=",R2,"\n") print(precision) print(recall) print(F_measure)
搞不清楚这么简单的东西,为什么很多人都说不清楚。
这里再简单解释一下summary输出结果:
Call: glm(formula = V16 ~ V7, family = binomial(link = "logit"), data = training) Deviance Residuals: Min 1Q Median 3Q Max -2.5212 -0.9990 -0.4249 1.1352 1.4978 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -0.744804 0.207488 -3.590 0.000331 *** V7 0.005757 0.001362 4.226 2.38e-05 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 307.76 on 221 degrees of freedom Residual deviance: 277.85 on 220 degrees of freedom AIC: 281.85 Number of Fisher Scoring iterations: 5