描述:使用数据挖掘中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()