常用的分类评估--基于R语言
2015-09-23 00:00
811 查看
摘要: 基于R语言的分类结果评估,涉及二叉树、决策树、随机森林、SVM、logistic、神经网络
######读取数据
数据分割默认8:2,大家可以自行调整
设定函数式
上面涉及到的模型没有优化,大家有能力的可以自行优化。
上面这段实现了一个自定义函数,具体实现大家自行看代码
设置中文显示和颜色
setwd("/Users/baidu/documents/data") getwd()
######读取数据
data<-read.csv("res050563.csv",header=T,sep = ",") data$f_ismove<-as.factor(data$f_ismove)
############################################################## ####对不平衡目标样本的样本处理 ############################################################## balance<-function(data,yval){ y.vector<-with(data,get(yval)) index.1<-which(y.vector==1) index.0<-which(y.vector==0) index.1<-sample(index.1,length(index.0),replace=T) result<-data[sample(c(index.0,index.1)),] result } data<-balance(data,"f_ismove")
############################################################## ####分割训练集数据和测试数据 ############################################################## apart.data<-function(data,train.data.persent=0.8){ train.index<-sample(c(1:nrow(data)),round(nrow(data)*train.data.persent)) data.train<-data[train.index,] data.test<-data[-c(train.index),] result<-list(train=data.train,test=data.test) result } p.data<-apart.data(data) data.train<-p.data$train data.test<-p.data$test
数据分割默认8:2,大家可以自行调整
mod.formula<-as.formula("f_ismove~.")
设定函数式
#### party #### library("party") ctree.sol<-ctree(mod.formula,data=data.train,control= ctree_control(mincriterion =0.95)) #plot(ctree.sol) #### rpart #### library("rpart") rpart.sol<-rpart(mod.formula,data=data.train,control=list(cp=0.001)) #plot(rpart.sol,uniform=TRUE,compress=TRUE,lty=3,branch=0.7) #text(rpart.sol,all=TRUE,digits=7,use.n=TRUE,cex=0.9,xpd=TRUE) #### logit #### glm.sol<-glm(mod.formula,data=data.train,family=binomial("logit")) #### randomForest #### library(randomForest) rf.sol<-randomForest(mod.formula,data.train,importance=T,proximity=T)#计算importance #### nnet #### library(nnet) nnet.sol<-nnet(mod.formula,data=data.train,size=30,maxit=1000)#size越高 树越大 #### svm #### library(e1071) svm.sol<-svm(mod.formula,data=data.train,probability = TRUE)#probability为T表示计算预测数值为取1和0的概率
上面涉及到的模型没有优化,大家有能力的可以自行优化。
############################################################## ####性能检验 ############################################################## library(ROCR) sol.performance<-function(sol,test,add.logic=F,color=NA){ ########使用prediction函数初始化数据######## test.real<-as.numeric(ifelse(test$f_ismove==0,0,1))#把目标变量的factor0变为0。factor1变为1 sol.class<-class(sol)[1] if(sol.class=="BinaryTree"){#ctree函数 test.pred<-as.numeric(predict(sol,test)) test.pred<-ifelse(test.pred==1,0,1)#把目标变量的1变为0;2变为1 }else{if(sol.class=="rpart"){#rpart函数 test.pred<-predict(sol,test)[,2] }else{if(sol.class=="glm"){#glm函数 glm.pred<-predict(sol,test) test.pred<-1/(1+exp(-glm.pred)) }else{if(sol.class=="randomForest.formula"){#rf函数 test.pred<-as.numeric(predict(sol,test)) test.pred<-ifelse(test.pred==1,0,1)#把目标变量的1变为0;2变为1 }else{if(sol.class=="nnet.formula"){#nnet函数 test.pred<-predict(sol,test) }else{if(sol.class=="svm.formula"){#svm函数 test.pred<-attr(predict(sol,test,probability=T),"probabilities")[,2] }else{ print("ERROR:sol输入有误!") return() }}}}}} predictions<-prediction(test.pred,test.real) ########计算混淆矩阵并使用performance函数计算灵敏度和auc######## if(sol.class=="BinaryTree"){#ctree函数 print("混淆矩阵:") print(table(test.pred,test.real,dnn=c("预测数值","真实数值"))) sens<-performance(predictions,'sens')@y.values[[1]][2] print(paste("灵敏度(Sensitivity):",sens,sep="")) spec<-performance(predictions,'spec')@y.values[[1]][2] print(paste("特指度(Specicity):",spec,sep="")) }else{if(sol.class=="rpart"){#rpart函数 print("混淆矩阵:") tmp<-ifelse(as.numeric(predict(sol,test,type="class"))==1,0,1)#把目标变量的1变为0;2变为1 print(table(tmp,test.real,dnn=c("预测数值","真实数值"))) auc<-performance(predictions,'auc')@y.values print(paste("ROC曲线下的面积(auc):",auc,sep="")) }else{if(sol.class=="glm"){#glm函数 print("混淆矩阵:") tmp<-ifelse(test.pred>0.5,1,0) print(table(tmp,test.real,dnn=c("预测数值","真实数值"))) auc<-performance(predictions,'auc')@y.values print(paste("ROC曲线下的面积(auc):",auc,sep="")) }else{if(sol.class=="randomForest.formula"){#rf函数 print("混淆矩阵:") tmp<-ifelse(as.numeric(predict(sol,test,type="class"))==1,0,1)#把目标变量的1变为0;2变为1 print(table(tmp,test.real,dnn=c("预测数值","真实数值"))) auc<-performance(predictions,'auc')@y.values print(paste("ROC曲线下的面积(auc):",auc,sep="")) }else{if(sol.class=="nnet.formula"){#nnet函数 print("混淆矩阵:") tmp<-as.numeric(predict(sol,test,type="class")) print(table(tmp,test.real,dnn=c("预测数值","真实数值"))) auc<-performance(predictions,'auc')@y.values print(paste("ROC曲线下的面积(auc):",auc,sep="")) }else{if(sol.class=="svm.formula"){#svm函数 print("混淆矩阵:") tmp<-ifelse(as.numeric(predict(sol,test,type="class"))==1,0,1)#把目标变量的1变为0;2变为1 print(table(tmp,test.real,dnn=c("预测数值","真实数值"))) auc<-performance(predictions,'auc')@y.values print(paste("ROC曲线下的面积(auc):",auc,sep="")) }else{ print("ERROR:sol输入有误!") return() }}}}}} ########绘制ROC曲线#### #如果predict返回的是0/1(tree模型)则roc是一个点的折线,如果是0-1的概率连续值(logic nnet等)则roc是多个点组成的曲线 plot(performance(predictions,'tpr','fpr'),colorize=T,main="ROC图",ylab="真正率(TPR)=灵敏度(Sensitivity)",xlab="假正率(FPR)=1-特指度(1-Specicity)",add=add.logic,colorize.palette=color) }
上面这段实现了一个自定义函数,具体实现大家自行看代码
par(family='STKaiti')#中文显示 col<-rainbow(6,start=0,end=5/6)
设置中文显示和颜色
sol.performance(ctree.sol,data.test,F,col[1]) sol.performance(rpart.sol,data.test,T,col[2]) sol.performance(glm.sol,data.test,T,col[3]) sol.performance(rf.sol,data.test,T,col[4]) sol.performance(nnet.sol,data.test,T,col[5]) sol.performance(svm.sol,data.test,T,col[6]) id=c("ctree模型","rpart模型","glm模型",'randomForest模型',"nnet模型","svm模型") legend("bottomright",legend=id,horiz=T,pch=15,col=col,cex=0.8,bty="n")
相关文章推荐
- nodejs实现获取某宝商品分类
- php通过分类列表产生分类树数组的方法
- asp飞飞无限级分类v1.0 Asp+sql+存储过程+ajax提供下载
- Oracle表的分类以及相关参数的详解
- php+mysql实现无限分类实例详解
- 用Python从零实现贝叶斯分类器的机器学习的教程
- 也谈 机器学习到底有没有用 ?
- R语言书籍的学习路线图
- PHP超牛逼无限极分类生成树方法
- ThinkPHP无限级分类原理实现留言与回复功能实例
- 量子计算机编程原理简介 和 机器学习
- 转载IP地址专题一
- 技术文章链接归档
- 什么是协议转换器及作用与分类
- 电容类别及封装形式
- R语言学习-统计之都
- 初识机器学习算法有哪些?
- R的若干基因及争论
- 10个关于人工智能和机器学习的有趣开源项目
- 机器学习实践中应避免的7种常见错误