看书标记【R语言数据分析与挖掘实战】6

第六章 电力窃漏电用户自动识别

6.1 背景与挖掘目标

通过获得的相关数据信息提取出窃漏电用户的关键特征,构建窃漏电用户的识别模型,就能自动检查判断用户是否存在窃漏电行为。本次数据挖掘建模目标如下:
1)归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型;
2)利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。

6.2 分析方法与过程

1.数据抽取
在这里插入图片描述
在这里插入图片描述2.数据探索分析
(1)分布分析:先对用电类别窃漏电的情况进行分类描述,知道窃漏电情况不常出现在非居民用电。
(2)周期性分析:对一位正常用电用户和一位窃漏电用户的用电趋势进行趋势对比。可知正常用户的用电趋势存在周期特征,整体趋势波动较小。而窃漏电用户的用电趋势有明显的波动,呈现下降趋势,且周期性不明显。
3.数据预处理
(1)数据清洗:筛选需要的数据,如非居民用电和节假日用电删除。
(2)缺失值处理:此处采用拉格朗日插值法对缺失值进行插补。公式: L n ( x ) = ∑ i = 0 n l i ( x ) y i , l i ( x ) = ∏ j = 0 , j ≠ i n x − x j x i − x j L_n(x)=\sum_{i=0}^{n}l_i(x)y_i,l_i(x)=\prod_{j=0,j\ne i}^{n}\frac{x-x_j}{x_i-x_j} Ln(x)=i=0nli(x)yi,li(x)=j=0,j=inxixjxxj,x为缺失值对应的下标序号。
(3)数据变换:对特征表露不明显的变量,需要重新构建。,基于数据变换,得到新的评价指标来表征窃漏电行为具有的规律。最终选择,用电量趋势(电量趋势下降指标)、线损增长率(线损指标)、与窃漏电相关的终端告警数(告警指标),对样本的窃漏电行为进行标记。
4.构建专家样本
获得291个样本
在这里插入图片描述
5.模型构建
(1)构建窃漏电用户识别模型:先数据划分

# 数据划分
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter6/示例程序")

# 把数据分为两部分:训练数据、测试数据
# 读入数据
Data <- read.csv("./data/model.csv")
# 数据命名
colnames(Data) <- c("time", "userid", "ele_ind", "loss_ind", "alarm_ind", "class")
# 数据分割
set.seed(1234)  # 设置随机种子
# 定义序列ind,随机抽取1和2,1的个数占80%,2的个数占20%
ind <- sample(2, nrow(Data), replace = TRUE, prob = c(0.8, 0.2))
trainData <- Data[ind == 1,]  # 训练数据
testData <- Data[ind == 2,]  # 测试数据
# 数据存储
write.csv(trainData, "./tmp/trainData.csv", row.names = FALSE)
write.csv(testData, "./tmp/testData.csv", row.names = FALSE)

然后用神经网络CART决策树训练模型

# 神经网络模型构建,输入节点为3,输出节点为1,隐藏层节点为10,权值的衰减参数为0.05
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter6/示例程序")
# 读取数据
trainData <- read.csv("./data/trainData.csv")
# 将class列转换为factor类型
trainData <- transform(trainData, class = as.factor(class))
# 神经网络模型构建
library(nnet) # 加载nnet包
# 利用nnet建立神经网络
nnet.model <- nnet(class ~ ele_ind + loss_ind + alarm_ind, trainData,size = 10, decay = 0.05)
summary(nnet.model)
# 建立混淆矩阵
confusion <- table(trainData$class, predict(nnet.model, trainData,type = "class"))
accuracy <- sum(diag(confusion)) * 100 / sum(confusion)
# 保存输出结果
output_nnet.trainData <- cbind(trainData, predict(nnet.model, trainData,type = "class"))
colnames(output_nnet.trainData) <- c(colnames(trainData), "OUTPUT")
write.csv(output_nnet.trainData, "./tmp/output_nnet.trainData.csv", 
          row.names = FALSE)
# 保存神经网络模型
save(nnet.model, file = "./tmp/nnet.model.RData")

CART决策树

# 构建CART决策树模型
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter6/示例程序")
# 读取数据
trainData <- read.csv("./data/trainData.csv")

# 将class列转换为factor类型
trainData <- transform(trainData, class = as.factor(class))

# 构建CART决策树模型
library(tree)#加载tree包
# 利用tree建立CART决策树
tree.model <- tree(class ~ ele_ind + loss_ind + alarm_ind, trainData)
summary(tree.model)

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

# 建立混淆矩阵
confusion <- table(trainData$class, predict(tree.model, trainData, 
                                            type = "class"))
accuracy <- sum(diag(confusion)) * 100 / sum(confusion)

# 保存输出结果
output_tree.trainData <- cbind(trainData, predict(tree.model, trainData, 
                                                  type <- "class"))
colnames(output_tree.trainData) <- c(colnames(trainData), "OUTPUT")
write.csv(output_tree.trainData, "./tmp/output_tree.trainData.csv", 
          row.names = FALSE)
# 保存CART决策树模型
save(tree.model,file = "./tmp/tree.model.RData")

(2)模型评价。训练好模型后,需要知道这两个准确率差不多的分类模型谁的性能更好,采用ROC曲线进行评估。好的分类器对应的ROC曲线会尽量靠近左上角。

# ROC曲线
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter6/示例程序")
# 读取数据
testData <- read.csv("./data/testData.csv")
# 读取模型
load("./tmp/tree.model.RData")
load("./tmp/nnet.model.RData")

# ROC曲线
library(ROCR)  # 加载ROCR包

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

# 画出CART决策的ROC曲线
tree.pred <- prediction(predict(tree.model, testData)[, 2], testData$class)
tree.perf <- performance(tree.pred, "tpr", "fpr") 
plot(tree.perf)

神经网络的ROC更靠近左上角(ROC曲线下面的面积更大),表明在这个模型中,神经网络的分类性能更好。
(3)将训练好的模型用于收集的数据,进行窃漏电诊断,进一步的可以定期分析窃漏电用户的用电行为,从而实现对模型的更新。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值