神经网络与决策树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神经网络

输出结果:
在这里插入图片描述
混淆矩阵:
在这里插入图片描述
有两个标签分类错误,结果比较准确。
4.2决策树分类
运行结果:
在这里插入图片描述
输出的决策树如附件所示:
在这里插入图片描述
convertoutput.pdf
有两个标签分类错误,结果比较准确。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值