电力窃漏电用户识别
数据集
链接: https://pan.baidu.com/s/167OzcIWj82O37Hku6tIpDA 提取码: sq27
由于missing_data.xls数据中有部分缺失值,故需要对数据进行补全
这里采用拉格朗日插值法补全
代码如下
#拉格朗日插值法处理数据缺失值
import pandas as pd
from scipy.interpolate import lagrange#导入拉格朗日插值函数
inputFile = 'D:\下载\data\input\missing_data.xls'
outputFile = 'D:\下载\data\output\missing_data_processed.xls'
data = pd.read_excel(inputFile,header = None)#导入数据
'''
自定义列向量插值函数
s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
'''
def ployinterp_column(s,n,k = 5):
y = s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取数
y = y[y.notnull()]#剔除空值
return lagrange(y.index,list(y))(n)#插值并返回结果
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:#如果为空就插值
data[i][j] = ployinterp_column(data[i],j)
data.to_excel(outputFile,header=None,index=False)#输出结果
构建窃漏电用户识别模型
可构建LM神经网络模型或CART决策树模型
CART决策树模型代码如下
#构建CART决策树模型
import pandas as pd
from random import shuffle#随机函数shuffle来打乱数据
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
from sklearn.metrics import roc_curve#导入ROC曲线函数
from sklearn.externals import joblib
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
dataFile = 'd:\下载\data\input\model.xls'
data = pd.read_excel(dataFile)
data = data.as_matrix()#将表格转化为矩阵
shuffle(data)#打乱数据
p = 0.8#设置训练数据比例
train = data[:int(len(data)*p),:]#前80%为训练集
test = data[int(len(data)*p):,:]#后20%为测试集
treeFile = 'd:/下载/data/output/tree.pkl'
tree = DecisionTreeClassifier()#建立决策树模型
tree.fit(train[:,:3],train[:,3])#训练模型
joblib.dump(tree,treeFile)
#自行编写的混淆矩阵可视化函数
def cm_plot(y, yp):
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')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
cm_plot(train[:,3],tree.predict(train[:,:3])).show()#显示混淆模型可视化结果
fpr,tpr,thresholds = roc_curve(test[:,3],tree.predict_proba(test[:,:3])[:,1],pos_label=1)
plt.plot(fpr,tpr,linewidth=2,label='ROC of ACRT')#作出ROC曲线
plt.xlabel('False Positive Rate')#坐标轴标签
plt.ylabel('True Positive Rate')
plt.ylim(0,1.05)#边界范围
plt.xlim(0,1.05)
plt.legend(loc=4)#图例
plt.show()
LM神经网络模型代码如下
#构建LM神经网络模型
import pandas as pd
from random import shuffle#随机函数shuffle来打乱数据
from keras.models import Sequential#导入神经网络初始化函数
from keras.layers.core import Dense,Activation#导入神经网络函数,激活函数
from sklearn.metrics import roc_curve
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
dataFile = 'D:\下载\data\input\model.xls'
data = pd.read_excel(dataFile)
data = data.as_matrix()#将表格转化为矩阵
shuffle(data)#打乱数据
p = 0.8#设置训练数据比例
train = data[:int(len(data)*p),:]#前80%为训练集
test = data[int(len(data)*p):,:]#后20%为测试集
netFile = 'D:\下载\data\output\net.model'#构建神经网络存储路径
net = Sequential()#建立神经网络
net.add(Dense(input_dim=3,output_dim=10))#添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu'))#隐藏层使用relu激活函数
net.add(Dense(input_dim=10,output_dim=1))#添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid'))#输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy',optimizer = 'adam')
#编译模型,使用adam方法求解
net.fit(train[:,:3],train[:,3],epochs=1000,batch_size=1)#训练模型,循环1000次
net.save_weights(netFile)#保存模型
predict_result = net.predict_classes(train[:,:3]).reshape(len(train))#预测结果变形
'''
keras用predict给出预测概率,predict_classes给出预测类别
而且二者的预测结构都是 n * 1维数组,而不是 1 * n维数组
'''
#自行编写的混淆矩阵可视化函数
def cm_plot(y, yp):
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')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
cm_plot(train[:,3],predict_result).show()#显示混淆矩阵可视化结果
predict_result = net.predict(test[:,3]).reshape(len(test))#预测结果变形
fpr,tpr,thresholds = roc_curve(test[:,3],predict_result,pos_label=1)
plt.plot(fpr,tpr,linewidth=2,label='ROC of LM')#作出ROC曲线
plt.xlabel('False Positive Rate')#坐标轴标签
plt.ylabel('True Positive Rate')
plt.ylim(0,1.05)#边界范围
plt.xlim(0,1.05)
plt.legend(loc=4)#图例
plt.show()