实例:电力窃漏电用户自动识别-神经网络和决策树(R语言)

1、数据划分

将专家样本划分为测试样本和训练样本,随机选取20%为测试样本,剩下来的作为训练样本。

data = read.csv(file="model.csv")

colnames(data) = c("time","userid","ele_ind","loss_ind","alarm_ind","class") #数据命名

head(data)

输出结果:

set.seed(1234) #设置随机种子

ind = sample(2,nrow(data),replace = TRUE,prob = c(0.8,0.2)) #定义序列ind,随机抽取1和2,1的个数占80%,2的个数占20%

traindata = data[ind==1,] #训练样本
testdata = data[ind==2,] #测试样本

write.csv(traindata,"traindata.csv",row.names = FALSE)
write.csv(testdata,"testdata.csv",row.names = FALSE) # 保存到当期工作目录下

2、建模-神经网络

traindata =transform(traindata,class = as.factor(class)) #将class列转换成因子类型

library(nnet)
nnet.model = nnet(class~ele_ind+loss_ind+alarm_ind,traindata,size=10,decay=0.05) #设定神经网络的输入节点为ele_ind,loss_ind,alarm_ind,输出节点为class,数据为traindata,隐层节点数为10,权值的衰减参数为0.05

confusion = table(traindata$class,predict(nnet.model,traindata,type="class")) #建立混淆矩阵
confusion

accuracy = sum(diag(confusion))*100/sum(confusion) #计算分类准确率
accuracy

输出如下:

output_nnet.traindata = cbind(traindata,predict(nnet.model,traindata,type="class"))

colnames(output_nnet.traindata) = c(colnames(traindata),"OUTPUT")

write.csv(output_nnet.traindata,"output_nnet.traindata.csv",row.names = FALSE) #保存输出结果

save(nnet.model,file="nnet.model.RData") #保存神经网络模型

2、建模-CART决策树

traindata =transform(traindata,class = as.factor(class)) #将class列转换成因子类型

library(tree)
tree.model = tree(class~ele_ind+loss_ind+alarm_ind,traindata) #建立CART决策树

plot(tree.model)
text(tree.model) #画决策树图

confusion = table(traindata$class,predict(tree.model,traindata,type="class")) #建立混淆矩阵
confusion

accuracy = sum(diag(confusion))*100/sum(confusion) #计算分类准确率
accuracy

输出如下:

output_tree.traindata = cbind(traindata,predict(tree.model,traindata,type="class"))

colnames(output_tree.traindata) = c(colnames(traindata),"OUTPUT")

write.csv(output_tree.traindata,"output_tree.traindata.csv",row.names = FALSE) #保存输出结果

save(tree.model,file="tree.model.RData") #保存CART决策树模型

3、模型比较

对于训练样本traindata,神经网络和CART决策树的分类准确率均达到90%。

利用测试样本对模型进一步评价,采用ROC曲线进行评估,一个优秀的分类器所对应的ROC曲线应该是尽量靠近左上角。

library(ROCR)

nnet.pred = prediction(predict(nnet.model,testdata),testdata$class)
nnet.perf = performance(nnet.pred,"tpr","fpr")
plot(nnet.perf) #画出神经网络模型的ROC曲线

结果如图:

tree.pred = prediction(predict(tree.model,testdata)[,2],testdata$class) #决策树模型预测时,生成(0,1)两列,取第二列
nnet.perf = performance(nnet.pred,"tpr","fpr")
plot(nnet.perf) #画出CART决策树的ROC曲线

结果如图:

对比发现,神经网络的ROC曲线更靠近左上角,说明神经网络模型的分类性能更好。

下一步工作是研究错、漏判的记录,优化模型的特征,提高识别的准确率。

猜你喜欢

转载自blog.csdn.net/zjlamp/article/details/81638005