您的位置:首页 > 其它

常用的分类评估--基于R语言

2015-09-23 00:00 811 查看
摘要: 基于R语言的分类结果评估,涉及二叉树、决策树、随机森林、SVM、logistic、神经网络

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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息