1. 实验基本原理及目的
神经网络算法:
输入:
N //初始神经网络
X //训练集的输入元祖
D //期望的输出元祖
输出:N //改进的神经网络(权重、偏倚)
有指导学习算法 //神经网络学习过程
step1:通过网络N输入X ,产生输出Y;
step2:比较期望输出D和实际输出Y;
step3:更新网络中的权重和偏倚值使误差下降;
输入:
N //初始神经网络
X={x1,x2….xh} //训练集的输入元组
D={d1, d2, …dn} //期望的输出元组
输出:
N //改进的神经网络(调整的权重和偏倚)
反向传播算法:
Propagation(N, X) //正向输入
计算均方误差 //计算MSE
Gradient(N, E) //梯度下降算法调整网络权值
决策树分类:
算法:Generate_decision_tree:由给定的训练数据产生一棵判定树
输入:训练样本D:训练元祖和它们对应的类标号的集合
元组属性列表: attribute_list
Attribute_selection_method():一个确定“最好地”划分数据元祖为个
体类的分裂准则的过程(或方法)
输出:一棵判定树。
方法:
(1) 创建结点 N;
(2) if samples 都在同一个类C then
(3) return N 作为叶结点,以类C标记;
(4) if attribut_list 为空 then //无剩余属性可划分
(5) return N 作为叶结点,标记为D中多数类; //多数表决
(6) 使用Attribute_selection_method(D, attribute_list) 选择最好的splitting_criterion
(7) 标记结点 N 为test_attribute;
(8) If splitting_attribute是离散值,允许多路划分,then //不限二叉树
(9) attribute_list attribute_list - splitting_attribute; //删除分裂属性
//划分元组并对每个分区产生子树
(10) for splitting_criterion的每个输出j (三种划分)
//其中一个分区Di(j=1,2…n)
(11) 设Dj 是D 中满足输出j的数据元组的集合;
(12) if Dj 为空then
(13) 加上一个树叶到结点N,标记为D中的多数类;
(14) else 加上一个由 Generate_decision_tree(Di, attribute_list)返
回的结点N; //递归划分
endfor
(15) 返回N;
2. 数据的准备及数据预处理
2.1神经网络
将数据读入,按8:2分别分为训练集和测试集data_practice,data_predict。
2.2决策树分类
将数据读入,按8:2分别分为训练集和测试集data_practice,data_predict。
3. 实验过程
3.1神经网络
1. 函数介绍:
read(datafile):数据预处理函数,datafile为文件所在位置,返回值为data_practice_x, data_practice_y,data_predict_x,data_predict_y分别为训练集的属性,标签,预测集属性,标签。
cm_plot(t1,output):画图函数,画出混淆矩阵,t1为数据的真实标签,output为预测标签。
2.源码:
#-*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
#数据预处理函数
def read(datafile):
df=pd.read_excel(datafile)
length=len(df)
data_practice=df[0:int(length*0.8)]
data_predict=df[int(length*0.8):]
data_practice_x=np.array(data_practice)[0:,0:3]
data_practice_y=np.array(data_practice)[0:,3:4]
data_predict_x=np.array(data_predict)[0:,0:3]
data_predict_y=np.array(data_predict)[0:,3:4]
return data_practice_x,data_practice_y,data_predict_x,data_predict_y
#混淆矩阵画图
def cm_plot(t1,output):
from sklearn.metrics import confusion_matrix
cm=confusion_matrix(t1,output)
# print(cm)
# print(len(cm))
import matplotlib.pyplot as plt
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('Predict label')
return plt
datafile='D:/ProgramData/file7/model.xls'
practice_x,practice_y,predict_x,predict_y=read(datafile)
#构建模型,输入节点有3个,隐含节点有5个,输出节点为1个
model = Sequential()
model.add(Dense(5, input_dim=3, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
#编译网络
model.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])
#训练网络
history = model.fit(practice_x, practice_y, epochs=100,batch_size=10)
#评价网络
loss, accuracy = model.evaluate(practice_x, practice_y)
print("\n损失函数值: %.2f, 分类准确率: %.2f%%" % (loss, accuracy*100))
#进行预测
probabilities = model.predict(predict_x)
for i in range(0,len(probabilities)):
if probabilities[i]<0.5:
probabilities[i]=0
else:
probabilities[i]=1
k=0
for i in range(0,len(probabilities)):
if predict_y[i]==probabilities[i]:
k=k+1;
accuracy=k/len(probabilities)
print("预测准确率: %.2f%%" % (accuracy*100))
cm_plot(probabilities,predict_y)
3.2决策树分类
1. 函数介绍:
read(datafile):数据预处理函数,datafile为文件所在位置,返回值为data_practice_x, data_practice_y,data_predict_x,data_predict_y分别为训练集的属性,标签,预测集属性,标签。
2.源码
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn import tree
#数据预处理函数
def read(datafile):
df=pd.read_excel(datafile)
length=len(df)
data_practice=df[0:int(length*0.8)]
data_predict=df[int(length*0.8):]
data_practice_x=data_practice[['电量趋势下降指标','线损指标','告警类指标']]
data_practice_y=data_practice[['是否窃漏电']]
data_predict_x=data_predict[['电量趋势下降指标','线损指标','告警类指标']]
data_predict_y=data_predict[['是否窃漏电']]
return data_practice_x,data_practice_y,data_predict_x,data_predict_y
datafile='D:/ProgramData/file7/model.xls'
practice_x,practice_y,predict_x,predict_y=read(datafile)
#进行分类
dtc = DecisionTreeClassifier()
dtc.fit(practice_x,practice_y)
test_y = dtc.predict(predict_x)
#进行评价
print('Accracy:',dtc.score(predict_x,predict_y))
print(classification_report(predict_y,test_y))
#输出为dot图像
with open("jueceshu.dot", 'w') as f:
f = tree.export_graphviz(dtc, out_file = f)
4. 实验结果分析
4.1神经网络
输出结果:
混淆矩阵:
有两个标签分类错误,结果比较准确。
4.2决策树分类
运行结果:
输出的决策树如附件所示:
convertoutput.pdf
有两个标签分类错误,结果比较准确。