1. 程式人生 > >機器學習-決策樹(decision tree)

機器學習-決策樹(decision tree)

  • 機器學習中分類和預測演算法的評估:
  • 準確率
  • 速度
  • 強壯性(演算法中當有噪音和某些值缺失時,演算法能否依然很好)
  • 可規模性
  • 可解釋性(能否很好的解釋模型)

一、什麼是決策樹?

1、判定樹(決策樹)是一個類似於流程圖的樹結構,其中,每個內部節點表示在一個屬性上的測試,每一個分支代表一個屬性輸出,而每個樹葉結點代表類或類分佈。樹的最頂層是根結點。 在這裡插入圖片描述 2.決策樹是機器學習中分類方法中的一個重要演算法 3.熵(entropy)概念: 資訊和抽象如何度量? 1948年,夏農提出了“資訊熵(entropy)”的概念。 一條資訊的資訊量大小和它的不確定性有直接的關係,要搞清楚一件非常非常不確定的事情,或者是我們一無所知的事情,需要了解大量資訊==》資訊量的度量等於不確定性的多少。 位元(bit)來衡量資訊的多少。 資訊熵計算公式:

變數的不確定性越大,熵也就越大。

二、決策樹歸納演算法(ID3)

選擇屬性判斷結點 資訊獲取量/資訊增益(Information Gain): Gain(A) = Info(D) - Infor_A(D) 通過A來作為結點分類獲取了多少資訊,下圖是根據年齡、收入、是否為學生、信用度來判斷一個人是否要購買電腦 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 類似,Gain(income) = 0.029 Gain(student) = 0.151 Gain(credit_rating) = 0.048 所以,由於age屬性的資訊增益最大,選擇age作為第一個根結點。 重複此過程。。。 在這裡插入圖片描述 下面是直接呼叫sklearn包的程式碼:

from sklearn.feature_extraction import DictVectorizer#sklearn對資料輸入格式有要求,不能是型別的資料,必是整形的資料,所以需要轉換
import csv#原始資料存在於csv檔案裡
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

#讀取csv檔案
allElectronicsData = open(r'D:\data\decisiontree.csv','rt')
reader = csv.reader(allElectronicsData)
#headers = reader.next()#headers指的是特徵
headers = next(reader)#headers是csv檔案的第一行資料
print(headers)

featureList = []#featureList是特徵值,例如年齡、信用度等
labelList = []#labellist是標籤值,也就是結果是否買電腦

for row in reader:
    labelList.append(row[len(row) - 1])
    rowDict = {}
    for i in range(1,len(row) - 1):
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)
print(featureList)

#利用python進行轉化
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()#特徵值的列表,是0,1的列表

print("dummyX:"+str(dummyX))
print(vec.get_feature_names())

print("labellist:"+str(labelList))

lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY:"+str(dummyY))

clf = tree.DecisionTreeClassifier(criterion = 'entropy')#不帶引數預設是基尼係數
#criterion = ‘entrropy’使用ID3方法
clf = clf.fit(dummyX,dummyY)
print("clf:"+str(clf))

#生成一個dot樹,可用dot命令生成pdf檔案
with open("allElectronicInformationGainOri.dot",'w') as f:
    f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file = f)

#oneRowX是拷貝出一條資料,修改一些特徵值,來進行測試
oneRowX = dummyX[0,:].reshape(1,-1)
print("oneRowX:"+str(oneRowX))
newRowX = oneRowX


newRowX[0][0] = 1
newRowX[0][2] = 0
print("newRowX:"+str(newRowX))

predictedY = clf.predict(newRowX)
print("predictedY:"+str(predictedY))

下面是decisiontree.csv的內容: 執行結果為: 在這裡插入圖片描述 執行cmd,生成的allElectronicInformationGainOri.dot檔案可以用dot生成pdf檔案(實現需要安裝Graphviz:(http://www.graphviz.org),然後需要配置環境變數,在path中新增) 命令:dot -Tpdf allElectronicInformationGainOri.dot -o test.pdf 結果為: 在這裡插入圖片描述