1. 程式人生 > 實用技巧 >決策樹---------2020.9.20

決策樹---------2020.9.20

決策樹

決策樹

一、 機器學習資料集

二、 分類/迴歸

三、 資訊熵

四、 列聯表

五、 資訊增溢

六、 生成決策樹

七、 訓練集誤差與測試集誤差

八、 過擬合

九、避免過擬合

十、數值型輸入

十一、另一種分類方法

十二、總結

一、 機器學習資料集

這組記錄的集合稱為一個“資料集”,其中每條記錄是關於一個事件或物件的描述,稱為一個“示例”或“樣本”,反映事件或物件在某方面的表現或性質的事項,屬性的取值稱為屬性值,屬性展開的空間稱為“屬性空間”。

二、 分類/迴歸

三、 資訊熵

ex1.

P(A)=1/4

P(B)=1/4

P(C)=1/4

P(D)=1/4

ex2.

P(A)=1/2

P(B)=1/4

P(C)=1/8

P(D)=1/8

如何編碼?

對於ex1,我們可以編碼A=00,B=01,C=10,D=11,顯然我們需要用到兩個bit來記錄事件;對於ex2,我們可以編碼A=0,B=10,C=110,D=111,所需bit數為

1×1/2+2×1/4+3×1/8+3×1/8=1.75bit。

記P(X=V1)=p1,P(X=V2)=p2,P(X=V3)=p3,…,P(X=Vm)=pm,如何計算傳輸資訊需要的最小bit數是多少?

高資訊熵意味著我們從資料集中獲取的資訊越少,不確定度越大;

低資訊熵意味著我們從資料集中獲取的資訊越多,不確定度越小。

四、 列聯表

列聯表(contingency table)是觀測資料按兩個或更多屬性(定性變數)分類時所列出的頻數表。它是由兩個以上的變數進行交叉分類的頻數分佈表。

五、 資訊增溢

對各個引數依次方法進行計算,從而找到資訊增溢最大的屬性。

六、 生成決策樹

樹以代表訓練樣本的單個結點開始。

如果樣本都在同一個類,則該結點成為樹葉,並用該類標號。

否則,演算法使用稱為資訊增益的基於熵的度量作為啟發資訊,選擇能夠最好地將樣本分類的屬性。該屬性成為該結點的“測試”或“判定”屬性。

對測試屬性的每個已知的值,建立一個分枝,並據此劃分樣本。

演算法使用同樣的過程,遞迴地形成每個劃分上的樣本判定樹。

Tips:1.如果葉子節點都有同樣的輸出值,例如

,則該節點停止遞迴;

2.沒有多餘的屬性可以進行劃分,此時少數服從多數。

思考:若所有屬性的資訊增溢都是零就停止遞迴是否合理?

令Y=a XOR b

如果資訊增益為0就停止遞迴,則生成決策樹

如果繼續遞迴,則生成決策樹

,顯然這才是我們想要的結果。

七、 訓練集誤差與測試集誤差

對所有訓練集記錄用生成的決策樹進行預測,預測輸出與實際輸出不一致的記錄量稱為訓練集誤差。

對所有測試集記錄用生成的決策樹進行預測,預測輸出與實際輸出不一致的記錄量稱為測試集誤差。

為啥測試集誤差比訓練集誤差差這麼多?

八、 過擬合

所有葉節點有且僅有一個記錄,所以訓練集誤差為0。

用測試集進行測試:

錯誤的葉節點(1/4)正確的葉節點(3/4)
錯誤的測試集(1/4) 1/16的測試集會因為錯誤的理由被正確的預測 3/16的測試集會因為測試集記錄的錯誤被錯誤的預測
正確的測試集(3/4) 3/16的測試集會因為葉節點預測錯誤而被錯誤的預測 9/16的測試集被正確的預測

結果:一共有3/8的測試集被錯誤預測。

e=0葉結點共有16個記錄,正確的記錄約佔75%即12個,所以該節點幾乎一定會預測正確;同理e=1葉節點也幾乎一定會預測正確。

幾乎不存在錯誤的葉節點幾乎所有葉結點都正確
錯誤的測試集(1/4) ≈0 因為測試集記錄錯誤,1/4的測試集會被錯誤的預測
正確的測試集(3/4) ≈0 3/4的測試集被正確的預測

結果:一共有1/4的測試集被錯誤預測。

過擬合定義:如果機器學習演算法過於匹配噪音或者過於匹配資料集中不相關的屬性,則會導致過擬合。如果機器學習演算法過擬合,在測試集上的預測通常不會好。

九、避免過擬合

一般來說我們一開始並不知道資料集中的屬性哪些與輸出並不相關,並且有時候屬性與輸出與否還與上下文有關(例如Y=a AND b,當b=0的時候,y的輸出顯然與a不相關)。

卡方檢驗:

計算得P(mpg與maker相互獨立)=13.5%

使用卡方檢驗避免過擬合的方法:

  1. 用之前的方法生成決策樹;

  2. 開始剪枝,從決策樹底部開始刪除所有p>MaxPChance的節點,直到沒有節點p>MaxPChance.

MaxPChance是在生成決策樹之前定義的魔法數。如果我們設定MaxPChance=0.1,那麼剪枝後

十、數值型輸入

通過劃分區間解決。

如何劃分?

定義

對每個需要劃分區間的數值型屬性,用對其進行劃分。

計算所需時間:

R---------------------該屬性中的記錄數

--------------------該屬性可能的取值數

十一、另一種分類方法

十二、總結

決策樹優點: (1)速度快: 計算量相對較小, 且容易轉化成分類規則. 只要沿著樹根向下一直走到葉, 沿途的分裂條件就能夠唯一確定一條分類。 (2)準確性高: 挖掘出來的分類規則準確性高, 便於理解, 決策樹可以清晰的顯示哪些欄位比較重要。

(3)可以處理連續和種類欄位。

缺點: (1)對於各類別樣本數量不一致的資料, 資訊增益偏向於那些更多數值的特徵。 (2)容易過擬合。 (3)忽略屬性之間的相關性。

實現程式碼:

 1 from sklearn.feature_extraction import DictVectorizer
 2 import csv
 3 from sklearn import preprocessing,tree
 4 
 5 allElectronicsData = open(r'C:\Users\dd\Desktop\cs_desktop\ex1.csv','r')
 6 reader = csv.reader(allElectronicsData)
 7 headers = next(reader)
 8 
 9 featureList = []
10 labelList = []
11 
12 for row in reader:
13     labelList.append(row[len(row)-1])
14     rowDict = {}
15     for i in range(1,len(row)-1):
16         rowDict[headers[i]] = row[i]
17     featureList.append(rowDict)
18     
19 vec = DictVectorizer()
20 dummyX = vec.fit_transform(featureList).toarray()
21 
22 
23 lb = preprocessing.LabelBinarizer()
24 dummyY = lb.fit_transform(labelList)
25 
26 clf = tree.DecisionTreeClassifier(criterion='entropy')
27 clf = clf.fit(dummyX,dummyY)
28 
29 with open("course1.dot",'w')as f:
30     f = tree.export_graphviz(clf, feature_names = vec.get_feature_names(),out_file = f)
31     
32 oneRowX = dummyX[0,:]
33 newRowX = oneRowX.copy()
34 
35 newRowX[0] = 1
36 newRowX[2] = 0
37 
38 newRowXX = []
39 newRowXX.append(oneRowX)
40 newRowXX.append(newRowX)
41 
42 
43 predictedY = clf.predict(newRowXX)
44 print("predictedY="+str(predictedY))

資料集: