1. 程式人生 > >雪飲者 決策樹系列(二)決策樹應用

雪飲者 決策樹系列(二)決策樹應用

ssi 字符串長度 mes pla 選擇 font com vector nac

  本篇以信息增益最大作為最優化策略來詳細介紹決策樹的決策流程。

  首先給定數據集,見下圖

  技術分享

註:本數據來源於網絡

本篇將以這些數據作為訓練數據(雖然少,但足以介紹清楚原理!),下圖是決策樹選擇特征的流程

技術分享

技術分享

(請原諒我的拍照技術技術分享)

圖中entropy代表決策樹在根節點處的信息熵,Entropy(age)表示用age這個特征作為分支節點後的信息熵,同理,Entropy(income)和Entropy(credit)分別表示用收入和信用作為分支節點後計算出的信息熵,註意這裏的信息熵並不是指某一次預測的實例選擇某個特征後的分類不確定度,而是指一個總體的情況,針對的是n次預測(n足夠大)。

信息增益就是用選擇特征前後的信息熵做差,求得最大的信息增益作為我們要選擇的特征。上圖只是計算了根節點的特征選擇情況,可以看出,選擇特征age可以得到最大的信息熵,所以根節點的特征就選取age,根節點下面的子樹的特征選擇同理。

  下面用程序來構建決策樹

  首先介紹環境:Windows系統,Python3.5.2,anaconda1.5.1,下面是代碼。

from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO # Read in the csv file and put features into list of dict and list of class label #allElectronicsData = open(‘D:\PythonWorkspace\DecisionTree\AllElectronics.csv‘, ‘r‘) #reader = csv.reader(allElectronicsData) #headers = reader.next() #D:\PythonWorkspace\DecisionTree\
with open("AllElectronics.csv","r") as csvfile: reader=csv.reader(csvfile) rows = [row for row in reader] headers=rows[0] readers=[] for i in range(1,len(rows)): readers.append(rows[i]) featureList = [] labelList = [] for row in readers: labelList.append(row[len(row)-1]) rowList = [] for i in range(1, len(row)-1): rowList.append(len(row[i]))#用字符串長度來標記對應的類別 featureList.append(rowList) print (labelList) print(featureList) clf = tree.DecisionTreeClassifier(criterion=entropy)#選擇信息增益 clf = clf.fit(featureList, labelList)#訓練模型 with open("allElectronicInformationGainOri.dot", w) as f: f = tree.export_graphviz(clf, feature_names=[age,income,student,credit_rating,class_buys_computer], out_file=f)#可視化模型,以dot文件輸出 newRowX = [11, 3, 3, 4]#找一個測試用例,因為訓練數據本身就少,就捏造一個吧。。。 predictedY = clf.predict(newRowX) print("predictedY: " + str(predictedY))

這是可視化為pdf的結果

技術分享

雪飲者 決策樹系列(二)決策樹應用