決策樹(Decision Trees ,DTs)是一種無監督的學習方法,用於分類和回歸。
優點:計算複雜度不高,輸出結果易於理解,對中間值缺失不敏感,可以處理不相關的特徵資料
缺點:可能會產生過度匹配的問題
適用資料型別:數值型與標稱型source code下載https://www.manning.com/books/machine-learning-in-action
執行demo
關鍵演算法
尋找分割資料集的最佳特徵
分割資料集
建立分支節點
呼叫函數createBranch並增加回傳結果到分支節點中
return 分支節點對應程式碼
class#class##class#class#class#class#class#class#class#class#class#class#class#class#class#class#class#class#class#class#4class
List
= [example[-1] for example in dataSet] 不是dataset[-1] {dataset倒數第一個元素} ,而這時裡,dataset每一個元素裡的倒數第一元素 if classList.count(classList[0]) == len(classList): 如果傳回分類List count類型一樣,則傳回該類型!在子節點是否可分類如是一類型回傳 否則遞歸
往下分類 return classList[0]#stop splitting when all of the classes are equal## == 1: #stop splitting when there are no more features in dataSet 如果只有一個元素 return majorityCnt(classList) Tope return majorityCnt(classList) Tope return majorityCnt(classList)
ature 尾) 選擇最好的特徵。索引
bestFeatLabel = labels[bestFeat ] 而得到這個label flippers 還是no surfaces 呢
myTree = {bestFeatLabel:{}} 該最好分類
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues) set是歸類,見 subLabels = labels[:] #copy all of labels, so trees don't mess up existing labels
myTree[bestFeatLabel][value] = createTree(splitData(dataSet, bestFeatLabel][value] = createTree(splitData(dataSet, bestFeatLab, value] = )
在分割數據集之前之後資訊發生的變化稱為資訊增益,劃分資料集的最大原則是將無序的資料變得更加有序。 這裡理解成切餅原理:
把資訊的複雜度,資訊量用單位熵描述程度。 對應的是餅的密度,如果是均等密度的垂直切餅,
每部分重量g = 總G * 其占大圓比例! 類比地,如果分割後資訊熵一樣, 每個小部分資料的 小h = pro * 總H, 而求和h[i] = H.
然而:我們需要的相反:需要的不是資訊熵一樣,而是不均等,例如上面,上綠的可能是草每餡,黃色是蘋果餡,藍色是紫薯,每個密度不同!
我們需要把它正確地劃分!分類出來,找出逼近不同餡之間的線。 這裡的 小h會最小化,而最終在面積不變下,總H會 逼近最小值,是最佳化問題解。
調試過程
calcShannonEnt
log(prob,2) log(1,2) = 0;2^0=1,因為prob
25行for featVec in dataSet: 計頻 for prop
chooseBestFeatureToSplit()
0.9709505944546686 = calcShannonEnt(dataSet) <class '205944546686 = calcShannonEnt(dataSet) <class '2]; ], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
#檢測資料集的每個子項是否屬於同一類: 如果值都是a,而result都是y或n 則為一類所以,只是兩個參數輸入
0.5509775004326937 = += prob * calcShannonEnt(subDataSet) 分開的子集後,的機率*香農滴,得到的和,原來的整體的香濃滴比
# 数据越接近,香浓熵值越少,越接近0 ,越不同,越多分逻辑,香浓熵就越大 # 只计算 其dataSet的featVec[-1] 结果标签 def calcShannonEnt(dataSet):
0.4199730940219749 infoGain = baseEntropy - newEntropy
像k鄰近 classify([0, 0], group, labels, 3) 意思是,把新資料[0,0] 按k=3的鄰近演算法在 group,labels資料裡的分類! group與label對應!
所以,是要把每個維度切出來+ 結果標籤 成二維的 一列數組,去比較分類
測試應該是,把前n個維量的值,向量輸入,輸出是yes or no!
一開始看,比較頭暈,條理清楚,理順下思路,看程式碼才易懂!
理解了目標和初始數據,你才明白,原來classList是結果標籤! ,是對應將要分類的dataset的對應結果標籤
而labels 則是特徵名,對應開始的dataset的維度,特徵的名strname
bestFeatLabel 最好分類特徵的維度名稱 是第一維度還是第二,第N
featValues 是bestFeatLabel 的維度下,的值數組。就是這一維度下的組別 用來做新的分類比較。
uniqueVals 用set判斷來是否一類,
例如
dataSet = [[1, 1, 'yes'],[0, 1, 'yes'],[1, 0, 'no' ],[1, 0, 'no'],[0, 0, 'no']]
labels = ['no surfacing','flippers',]
這樣的createTree :{'flippers': {0: 'no', 1: 'yes'}} 直接把no surfacing的維度省略了
以上是python機器學習決策樹詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!