首頁 >後端開發 >Python教學 >python機器學習決策樹詳細介紹

python機器學習決策樹詳細介紹

高洛峰
高洛峰原創
2017-03-19 14:20:142096瀏覽

決策樹(Decision Trees ,DTs)是一種無監督的學習方法,用於分類和回歸。

優點:計算複雜度不高,輸出結果易於理解,對中間值缺失不敏感,可以處理不相關的特徵資料
缺點:可能會產生過度匹配的問題
適用資料型別:數值型與標稱型source code下載https://www.manning.com/books/machine-learning-in-action

執行demo

關鍵演算法

if so return 類別標籤;

else

  尋找分割資料集的最佳特徵
         分割資料集
         建立分支節點
          呼叫函數createBranch並增加回傳結果到分支節點中
       return 分支節點對應程式碼

def createTree(dataSet,labels):

     

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.

 然而:我們需要的相反:需要的不是資訊熵一樣,而是不均等,例如上面,上綠的可能是草每餡,黃色是蘋果餡,藍色是紫薯,每個密度不同! python機器學習決策樹詳細介紹

我們需要把它正確地劃分!分類出來,找出逼近不同餡之間的線。 這裡的 小h會最小化,而最終在面積不變下,總H會 逼近最小值,是最佳化問題解。


調試過程
calcShannonEnt : [[1, 'no'], [1, 'no']] = 0    log(1, 2) * 0.4 = 0 為什麼是0,因為pro必然是1
log(prob,2) log(1,2) = 0;2^0=1,因為prob : [[1, 'yes'], [1, 'yes'], [0, 'no']] = 0.91 >> * 0.6 = 0.55
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

## 

#總結:  

  一開始,看程式碼看不懂,不明白到底是要做什麼!分類,我們的目標是把一堆資料分類,用label標籤上。

像k鄰近 classify([0, 0], group, labels, 3) 意思是,把新資料[0,0] 按k=3的鄰近演算法在 group,labels資料裡的分類! group與label對應!

後面看到了

        

python機器學習決策樹詳細介紹

 

才理解,資料dataSet 的意思是 條個維度的值 而最後一個是是否為fish的,結果標籤

所以,是要把每個維度切出來+ 結果標籤 成二維的 一列數組,去比較分類
測試應該是,把前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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn