神经网络与决策树Python实现

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神经网络

输出结果:

神经网络与决策树Python实现

混淆矩阵:

神经网络与决策树Python实现

有两个标签分类错误,结果比较准确。

4.2决策树分类

运行结果:

神经网络与决策树Python实现

输出的决策树如附件所示:

神经网络与决策树Python实现

convertoutput.pdf

有两个标签分类错误,结果比较准确。


分享到:


相關文章: