利用神经网络识别窃电用户

2019-04-13 11:26发布

目标
识别用户是否存在窃电行为 分析思路与流程
识别用户是否存在窃电行为是预测模型中的分类问题,故采用分类模型
确定模型之后,需要根据模型的要求,归纳窃电用户的关键特征
关键特征的获取,可能需要对数据进行一定的清洗,探索分析及预处理 数据抽取 - 数据探索分析 - 数据预处理,包括清洗和处理缺失值等 - 数据指标构建 - 模型构建及评价 PS:由于数据隐私,本文着重讲 缺失值处理,模型构建和模型的评价,这也是挖掘模型的主要内容
一、数据抽取 二、数据探索分析
1 分布分析,分析不同用电类别窃电条形图,接下来的分析可以不考虑非居民类别的用电数据 这里写图片描述 2 周期性分析 正常用户用电量趋势。线形图,用点趋势较为平稳 这里写图片描述 窃电用户用电量趋势。随着时间持续下降,可以作为异常用电的电量指标特征 这里写图片描述 三、数据预处理
1 数据清洗。清除无关数据,清除居民用电数据,节假日用电数据
2 缺失值处理。利用拉格朗日插值法填补缺失值 用电量数据: 这里写图片描述 利用拉格朗日插值法,将缺失值补上。编写的拉格朗日插值函数,代码如下: def lag_range(x): from scipy.interpolate import lagrange for i in range(len(x)): if (x.isnull())[i]: x1 = x[list(range(i-5,i)) + list(range(i+1,i+6))] x2 = x1[x1.notnull()] x[i]=lagrange(list(x2.index),list(x2))(i) else: pass return x 最后,得到插值的结果,并将插值补上 这里写图片描述 四、构建数据指标,构建专家样本。共有三类指标:电量趋势下降指标、线损指标、告警类指标。通过这三类指标来判断用户是否窃电 这里写图片描述 总共有291条数据,通过3列指标判断用户是否窃电 五、构建模型 首先,将专家样本划分为训练集和测试集。将数据打散,将前80%的数据(232条)划分为训练集,后20%的数据(59条)划分为测试集。代码如下: from random import shuffle # 数据打散,建立训练样本和测试样本 m_d_a = d.as_matrix() shuffle(m_d_a) p = 0.8 train_a = m_d_a[:int(len(m_d_a)*p)] # 训练集 test_a = m_d_a[int(len(m_d_a)*p):] # 测试集 其次,构建神经网络模型,代码如下: from keras.models import Sequential from keras.layers import Dense,Activation # 导入神经网络层函数、激活函数 model = Sequential() model.add(Dense(input_dim=3, units=10)) # 输入层3个输入特征值,中间层10个中间节点 model.add(Activation('relu')) # 中间(隐藏)层使用 rule 函数,快速 model.add(Dense(input_dim=10, units=1)) # 10个中间节点,输出层1个节点 model.add(Activation('sigmoid')) # 输出层函数使用sigmoid函数, model.compile(loss='binary_crossentropy', optimizer='adam') # 编译模型,损失函数,求解方法 model.fit(train_a[:,0:3], train_a[:,3:], epochs = 1000, batch_size=30) # epochs训练次数,batch_size每批训练数据的大小 predict_result = model.predict_classes(train_a[:,0:3]) # 预测结果 最后,使用混淆矩阵,检验测试集的准确度,查看模型预测的效果,代码如下: def cm_plot(y, yp): # 混淆矩阵函数 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y, yp) plt.matshow(cm, cmap=plt.cm.Greens) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center') cm_plot(test_a[:,3:], predict_result) # 显示混淆矩阵 这里写图片描述 可以看出,分类的准确率为(49+3)/59 = 88.13%,结果还行。其实神经网络的预测结果还可以更高,通过输入更多的训练集量,训练更多的次数,会得到更好的结果