有一段時間沒來更新部落格了,這段時間總體把機器學習的幾個基本原理理解了一遍,又利用keras、opencv、tensorflow等將人臉識別,漢字識別等功能重新實現了一遍,算是有點小感悟。接下來會針對每一種機器學習演算法原理做詳細講解以及工程實現。因為在實際工作中,雖然有很多很成熟的框架可以用,但是如何用好,達到一定效率和效果就依賴對原理的理解了。廢話不多說了,開始我們的學習之旅吧!
決策樹的本質問題就是計算資訊增益值,然後根據資訊增益值最**擇最優特徵分類,那麼問題來了,什麼是資訊增益呢?這其實是概率統計裡面的概念,可以這樣理解:就是某一項特徵值,通過某種概率統計計算公式得到它在總體情況下由它決定結果概率的大小。
公式如下:
設特徵a有n個不同的取值,根據特徵a的取值將d劃分為n個子集d1,d2,···,dn,|di|為di的樣本個數。記子集di中屬於ck的樣本的集合為dik,即dik = di ∩ ck,|dik|為dik的樣本個數。於是經驗條件熵的公式可以些為:
接下來是編碼實現公式的問題了!!
1、第一步
拿到資料集,我們首先計算資料集的香龍熵h,這個很簡單,根據公式計算即可,python**如下
def calshan(dataset):
m=len(dataset)
labeldic={}
for fe in dataset:
if fe[-1] not in labeldic.keys():
labeldic[fe[-1]]=0
labeldic[fe[-1]]+=1
shno=0.0
for key in labeldic:
pro=float(labeldic[key]/m)
shno-=pro*log(pro,2)
return shno
2、第二步
計算資訊增益,這裡就是利用以上的公式,這裡需要注意的是我們計算每個特徵下每乙個類別的熵h(di)時需要先將資料集進行分離,建立對應類別的子集,然後呼叫第一步對應的方法就可以計算了,python**如下
def splitdata(dataset,i,val):
#m=len(dataset)
subdata=
for fec in dataset:
if fec[i]==val:
newfec=fec[:i]
newfec.extend(fec[i+1:])
return subdata
def calzeyi(dataset):
numfec=len(dataset[0])-1
basesh=calshan(dataset)
#print(basesh)
zeyi=
newsh=0.0
for i in range(numfec):
featlist=[example[i] for example in dataset]
fea=set(featlist)
print(fea)
for val in fea:
subdata=splitdata(dataset,i,val)
#print(subdata)
pro=len(subdata)/float(len(dataset))
newsh+=pro*calshan(subdata)
subzeyi=basesh-newsh
return zeyi
第三步、利用最優特徵值進行分類
在第二部中已經得到如何計算乙個資料集的資訊增益,就可以選擇出具有決定性的分類特徵,然後根據特徵的類別劃分子集,然後遞迴,對子集重複計算資訊增益,分類,直到有確定的分類結果為止
決策樹優缺點
優點:理解簡單,需要的資料集不大,能夠處理多輸出問題
缺點:容易過擬合,不穩定,微小的變化可能導致大的分類錯誤
本文參考:
機器學習 決策樹原理與應用
決策樹是一種基於規則的方法,它用一組巢狀的規則進行。在樹的每個決策節點處,根據判斷結果進入乙個分支,反覆執行這種操作直到到達葉子節點,得到 結果。這些規則是通過訓練得到的而不是人工制定的。一般將決策樹設計成二叉樹。與樹的葉子節點,非葉子節點相對應,決策樹的的節點,分為兩種型別。1 決策節點 在這些節...
機器學習之決策樹
在這裡,我想以更直觀的方式幫助各位理解 掌握並且運用 注意 是運用 決策樹,從而為機器學習作鋪墊。ps 但還是希望大家稍微知道決策樹大概是什麼樣子。1.根結點 root node 沒有入邊,但有零條或多條出邊 2.內部結點 internal node 恰有一條入邊和 兩條或多條出邊 3.葉結點 le...
機器學習之決策樹
決策樹是很常見的機器學習分類演算法,竟然叫決策樹,那麼它的模型其實就像樹一樣。通過對樣本集的學習,挖掘出有用的規則。對於程式設計師來說或許以條件語句來看就更好理解了,決策樹可以看成是多個if then條件語句的集合。這種模型等同於我們寫的條件語句,所以它的 分類速度是很快的。來個例子了解下決策樹分類...