电力切漏电用户自动识别

描述:使用数据挖掘中LM神经网络和CART决策树算法,首先分析窃漏电用户行为特征,对数据预处理,采用拉格朗日插值算法补全数据,构建专家样本,建立LM神经网络和CART决策树模型,同时画出两个模型的ROC曲线图和可视化混淆矩阵,用于评价模型优劣。

代码:

#将原始数据分为20%的测试样本和80%的训练样本
import pandas as pd
from random import shuffle #导入随机函数shuffle,用来打乱数据
from keras.models import Sequential  # 导入神经网络初始化参数
from keras.layers.core import Dense, Activation  # 导入神经网络层函数,激活层函数
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
from sklearn.externals import joblib #保存模型


#根据LM神经网络,绘制决策树模型ROC曲线
def DrawLMRoc(net,test,plt1):
    from sklearn.metrics import roc_curve #导入ROC曲线函数
    predict_result = net.predict(test[:, :3]).reshape(len(test))
    fpr,tpr,thresholds = roc_curve(test[:,3],predict_result,pos_label=1)
    plt1.plot(fpr, tpr, linewidth=2, label='ROC of LM')  # 作出ROC曲线
    plt1.xlabel('False Positive Rate') #坐标轴标签
    plt1.ylabel('True Positive Rate')
    plt1.ylim(0,1.05) #边界范围
    plt1.xlim(0,1.05)
    plt1.legend(loc=4) #图例
    plt1.show()
    
#根据CARA模型,绘制ROC决策树模型ROC曲线
def DrawCARTRoc(test,tree,plt2):
    from sklearn.metrics import roc_curve  # 导入ROC曲线函数
    fpr,tpr,thresholds = roc_curve(test[:,3],tree.predict_proba(test[:,:3])[:,1],pos_label=1)
    plt2.plot(fpr,tpr,linewidth=2,label='ROC OF CARA')
    plt2.xlabel('False Positive Rate')  # 坐标轴标签
    plt2.ylabel('True Positive Rate')
    plt2.ylim(0, 1.05)  # 边界范围
    plt2.xlim(0, 1.05)
    plt2.legend(loc=4)  # 图例
    plt2.show()
    

#构建CART决策树模型
def CartModel(train):
    treefile = 'F:/tree.pkl' #模型输出名字
    tree = DecisionTreeClassifier()
    tree.fit(train[:,:3],train[:,3]) #训练
    #保存模型
    joblib.dump(tree,treefile)
    
    return tree
   
 

#自定义混淆矩阵可视化函数
def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix  #导入混淆矩阵函数
    cm = confusion_matrix(y,yp) #混淆矩阵
    import matplotlib.pyplot as plt
    plt.matshow(cm,cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用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


# 构建LM神经网络模型
def KerasModel(train):
    netfile = 'F:/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], nb_epoch=10, batch_size=1)  # 训练模型,循环1000次
    #net.save_weights(netfile)  # 保存模型
    
    '''这里要提醒的是,kreas用predict给出预测概率,predict_classes才是给出的预测类别,而且两者的预测结果都是n,x,1维数组,而不是通常的1 x n'''
    predict_result = net.predict_classes(train[:, :3]).reshape(len(train))  # 预测结果变形
    return predict_result, net

def main():
    datafile = 'F:/Python/IDLE--python/BigDataAnalyze/chapter6-data/data/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%为测试集
    predict_result,net= KerasModel(train)
    
    print(train[:,3])
    print(predict_result)
    
    plt1 = cm_plot(train[:,3],predict_result)
    plt1.show() #显示混淆矩阵可视化结果
    DrawLMRoc(net,test,plt1)
    #决策树模型
    tree = CartModel(train)
    # 注意Scikit-Learn使用predict方法直接给出预测
    plt2 = cm_plot(train[:, 3], tree.predict(train[:, :3]))
    plt2.show()  # 显示混淆模型可视化结果
    DrawCARTRoc(test,tree,plt2)
    
if __name__ == '__main__':
    main()


你可能感兴趣的:(数据分析)