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
有兩個標籤分類錯誤,結果比較準確。
閱讀更多 邵寒峰 的文章