神經網絡與決策樹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

有兩個標籤分類錯誤,結果比較準確。


分享到:


相關文章: