決策樹演算法是一種逼近離散函式值的方法
通過把例項從根節點排列到某個葉子結點來對例項分類。葉子結點即為例項所屬的分類。樹上的每乙個結點指定了對例項的某個屬性的測試,並且該結點的每乙個後繼分支對應於該屬性的乙個可能值。分類例項的方法是從這棵樹的根節點開始,測試這個結點的屬性,然後按照給定例項的屬性值對應的樹枝向下移動。然後這個過程在以新結點的根的子樹上重複。
構造決策樹的時候,第乙個需要解決的問題是:當前資料集上哪個特徵在劃分資料分類時起決定性作用。
為了找到決定性的特徵,劃分出最好的結果,我們必須評估每個特徵。完成測試之後,原始資料集就被劃分為幾個資料子集。這些資料子集會分布在第乙個決策點的所有分支上。如果某個分支下的資料屬於同一型別,則當前已經正確劃分資料型別如果資料不屬於同一型別,則需要重複劃分資料子集的過程。
如何劃分資料子集的演算法和劃分原始資料集的方法相同,直到所有具有相同型別的資料均在乙個資料子集內。
createbranch():
檢測資料集中的每個子項是否屬於同一分類:
if so return 類標籤;
else
尋找劃分資料集的最好特徵
劃分資料集
建立分支節點
for 每個劃分的子集
呼叫函式createbranch並增加返回結果到分支節點中
return 分支節點
收集資料
準備資料:樹構造演算法只適用於標稱型資料,因此數值型資料必須離散化。
分析資料:可以使用任何方法,構造樹完成之後,我們應該檢查圖形是否符合預期。
訓練演算法:使用經驗樹計算錯誤率
測試演算法:使用經驗樹計算錯誤率。
使用演算法
資訊增益(information gain)
劃分資料的最大原則是:將無序的資料變得更加有序。
在劃分資料集之前之後資訊發生的變化稱為資訊增益,計算每個特徵值劃分資料集獲得的資訊增益,活的資訊增益最高的特徵就是最好的選擇。
如何計算資訊增益?我們利用熵來度量(還有一種叫做基尼不純度gini impurity)
集合資訊的度量方式稱為熵,熵定義為資訊的期望值
那麼資訊的定義:
如果待分類的事務可能劃分在多個分類之中,則符號xi的資訊定義:
l(xi)=-log2p(xi) 其中p(xi) 是選擇該分類的概率
計算熵的公式 h=-p(xi)log2p(xi)(從i=1到n求和)
python實現:計算給定資料集的熵
from math import log
defcalcshannonent
(dataset):
numentries = len(dataset) #計算數集中例項的總數
labelcounts = {} #建立乙個字典,鍵是最後一列的數值
for featvec in dataset:
currentlabel = featvec[-1]
if currentlabel not
in labelcounts.keys():
labelcounts[currentlabel] = 0
#如果當前鍵不存在,則擴充套件字典並將當前鍵值加入字典
labelcounts[currentlabel] += 1
# 當前類別鍵值加一,鍵值代表著類別出現的次數
shannonent =0.0
for key in labelcounts:
prob = float(labelcounts)/numentries
shannonent -= prob *log(prob,2)
#利用熵公式計算
return shannonent
劃分資料集 機器學習實戰 決策樹
決策樹 2 python語言在函式中傳遞的是列表的引用,在函式內部對列表物件的修改,將會影響該列表物件的整個生存週期。為了消除這個不良影響,我們需要在函式的開始宣告乙個新列表物件。在本節中,指的是在劃分資料集函式中,傳遞的引數dataset列表的引用,為了不影響dataset我們重新宣告了乙個ret...
機器學習實戰決策樹
這幾天一直在學習機器學習實戰python 實現,在程式清單的3 6 獲取及誒單數程式,書上的程式是這樣的 def getnumleafs mytree numleafs 0.0 firststr list dict.keys mytree 0 seconddict mytree firststr p...
機器學習實戰 決策樹
class sklearn.tree.decisiontreeclassifier criterion gini splitter best max depth none,min samples split 2,min samples leaf 1,min weight fraction leaf ...