我與機器學習 - [Today is DT] - [決策樹]
優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不敏感,可以處理不相關特徵資料
缺點:可能會產生過度匹配的問題
適用資料型別:數值型和標稱型
在構造決策樹時,我們需要解決的第一個問題就是當前是那個特徵在決定決策樹的劃分。為了找到起決定性的特徵,劃分出最好的結果,我們必須評估每個特徵。
所以構建決策樹的流程就是,首先判斷資料是否是同一個型別的,如果不是,找到劃分這些資料起決定性因素的特徵,按照這個特徵來劃分資料,劃分完成後的資料,接著判斷是否屬於同一類別,如果是就返回這個類別節點,如果不是,繼續尋找最好的特徵來劃分資料。
虛擬碼:
檢測資料集中的每個子項是否屬於同一分類:
if so return 類標籤;
else
尋找劃分資料集的最好的特徵
劃分資料集
建立分支節點
for 每個劃分的子集
遞迴呼叫次虛擬碼並增加返回結果到分支節點上去
return 分枝結點
樹構造演算法只適用於標稱型資料,因此數值型資料需要離散化
用到的一些技術:
1. 資訊熵,劃分資料的重要原則是將無序的資料變的更加有序。劃分資料的方式有很多,組織雜亂無章資料的一種方法就是使用資訊度量論度量資訊,資訊理論是量化處理資訊的分支科學。我們可以在劃分資料之前使用資訊理論量化度量資訊的內容。
資訊增益是熵的減少或者是資料無序度的減少。
在劃分資料之前之後資訊發生的變化稱為資訊增益,知道如何計算資訊增益,我們就可以計算每個特徵值劃分資料集獲得的資訊增益,獲得資訊增益最高的特徵就是最好的特徵。
資訊熵計算公式:p(xi) * log p(xi) i為下標,i從1加到n n為分類的數量
計算資訊熵的程式程式碼思路:
1.獲得樣本總數量
2.計算各個標籤出現的次數
3.對每一個標籤,計算他出現的概率 用標籤出現的次數 / 樣本的總數量
4.使用公式計算該標籤的資訊熵
5.將所有標籤的熵求加和的相反數
另一個度量集合無序程度的方法是基尼不純度(Gini impurity),簡單的說就是從一個數據集中隨機選取子項,度量其被錯誤分類其他組裡概率。
2. 資料集劃分方式,給定某個特徵的某個特徵值,遍歷資料集按照該特徵的特徵值將資料分為兩部分。
3.尋找最佳特徵虛擬碼:
得到所有的特徵
計算整個資料集的資訊熵
初始化最佳劃分資訊熵和最佳特徵
遍歷所有的特徵
取資料集上該特徵對應的所有值
使用集合篩掉重複值
初始化該特徵下的新增資訊熵
遍歷無重複的特徵對應的值
對該值進行對資料集的劃分
計算劃分後的資料集特徵資訊熵
將每個特徵值劃分得到的特徵資訊熵加和
使用該特徵值劃分資料得到的熵等於整個資料集的資訊熵減去該特徵每個特徵值得到的資訊熵加和
如果該特徵值劃分資料得到的熵大於最佳劃分資訊熵
記錄該最佳劃分資訊熵
記錄該最佳特徵
返回最佳特徵
4.當所有特徵都是用完畢,但是類標籤還是不唯一的時候使用多數表決的辦法來決定,計算這些不同的類標籤的數量,返回數量較大的那個類標籤
5.構建樹虛擬碼:
獲取資料最後一列標籤值
如果標籤的值全都一樣了就返回該標籤值退出
如果特徵只有一個了,就使用第四步用多數表決的辦法返回類別
獲取最佳特徵
根據最佳特徵的下標獲取最佳特徵的描述
建立樹字典 {最佳標籤描述:{}}
刪除該標籤label
獲取該特徵下的所有特徵值,並使用set過濾重複值
遍歷無重複的特徵值
構建子標籤集,為刪除上一個最佳特徵標籤的所有標籤
遞迴呼叫構建樹 數字典 = 遞迴呼叫返回值
返回樹字典
6.預測虛擬碼
首先找到樹的第一個分類特徵也就是第一個key
根據該key,在特徵標籤集合裡面找到對應標籤的下標
根據key獲得子節點的字典
遍歷子節點字典
如果測試向量對應該虛擬碼第二步下標的值等於子節點的key
判斷該子節點是否還是字典,如果是就遞迴,如果不是返回值
構造決策樹是很耗時的任務,即使處理很小的資料集,也要花費幾秒的時間,如果資料集很大會花費更多的時間,然而用建立好的決策樹解決問題則可以很快完成。可以使用python的pickle模組,將樹模型儲存在需要的時候加載出來。
import pickle
儲存:
fw = open(filename,‘w’)
pickle.dump(tree,fw)
fw.close()
讀取:
fr = open(filename)
return pickle.load(fr)
本次使用的演算法成為ID3,該演算法無法直接處理數值型資料。
程式碼路徑:https://github.com/HanGaaaaa/MLAProject/tree/master/Dt