1. 程式人生 > >AlgorithmDeveloper 決策樹演算法實現.md

AlgorithmDeveloper 決策樹演算法實現.md

以相親為例子

image.png

建立資料集

def creatDataSet():
    dataSet= [[1,1,1,'見'],
               [1,0,1,'見'],
               [1,0,0,'不見'],
               [0,1,0,'見'],
               [0,0,1,'不見'],
               [0,1,1,'見']]
    labels=['富有','人品','外貌','見或不見']
    return dataSet,labels
dataSet,labels=creatDataSet()
import pandas as
pd from math import log
train_set = pd.DataFrame(dataSet,columns=labels)
train_set
富有 人品 外貌 見或不見
0 1 1 1
1 1 0 1
2 1 0 0 不見
3 0 1 0
4 0 0 1 不見
5 0 1 1

計算資訊熵

image.png

計算資訊熵,咱們首先得知道Pi,而計算Pi,咱們首先得知道特徵類別的樣本個數,所以需要遍歷特徵所有類別值,並記錄下“1”或者“0”的個數,方便計算。

#計算夏農熵
def calcShannonEnt(dataSet):
    #樣本總個數
    totalNum = len(dataSet)
    # 類別集合
labelSet = {} #計算每個類別的樣本個數 for dataVec in dataSet: label = dataVec[-1] if label not in labelSet.keys():###keys 返回所有鍵 labelSet[label] = 0##這個操作會自動把字典中本沒有的標籤加入其中,比如字典中本來沒有’見’,那麼執行此次操作之後就自動添加了。 labelSet[label]+=1 shannonEnt = 0 #計算熵值 for key in labelSet: pi = float(labelSet[key])/totalNum shannonEnt = -pi*log(pi,2) return shannonEnt
print("樣本熵:%f"% calcShannonEnt(dataSet))
樣本熵:0.918296
len(dataSet)
6

選擇最好的特徵劃分資料集

在對每個節點進行劃分時,都需要從未選擇的特徵中選擇一個最好的進行資料集的劃分;ID3/C4.5演算法分別選擇資訊增益/資訊增益比最大的特徵對當前節點進行分類;這裡再回顧一下相關計算公式:

image.png

image.png

image.png

#按給定特徵劃分資料集:返回第featNum個特徵其值為value的樣本集合
#且返回的樣本資料中已經去除該特徵
def splitDataSet(dataSet,featNum,featvalue):
    reDataSet=[]#返回第featNum個特徵其值為value的樣本集合
    for dataVec in dataSet:
        if dataVec[featNum]==featvalue:
            splitData = dataVec[:featNum]
            splitData.extend(dataVec[featNum+1:])##extend後面新增一個列表,append後面新增一個元素
            reDataSet.append(splitData)
    return reDataSet
#選擇最好的特徵劃分資料集
def chooseBestFeatTopSplit(dataSet):
    featNum = len(dataSet[0])-1
    maxInfoGain = 0
    bestFeat = -1
    #計算樣本熵值,對應公式中:H(X)
    baseShanno = calcShannonEnt(dataSet)
    #以每一個特徵進行分類,找出使資訊增益最大的特徵
    for i in range(featNum):
        featList = [dataVec[i]for dataVec in dataSet]
        featList = set(featList)
        newShanno = 0
        #計算以第i個特徵進行分類後的熵值,對應公式中:H(X|Y)
        for featValue in featList:
            subDataSet = splitDataSet(dataSet,i,featValue)
            prob = len(subDataSet)/float(len(dataSet))
            newShanno += prob*calcShannonEnt(subDataSet)
        #ID3演算法:計算資訊增益,對應公式中:g(X,Y)=H(X)-H(X|Y)
        infoGain = baseShanno - newShanno
        #C4.5演算法:計算資訊增益比
        #infoGain = (baseShanno - newShanno)/baseShanno
        #找出最大的熵值以及其對應的特徵
        #C4.5目前還沒看呢
        if infoGain>maxInfoGain:
            maxInfoGain=infoGain
            bestFeat=1
    return bestFeat

比如:按第0個特徵(“財富”),值為1(“有錢”)劃分樣本資料,得到的資料集如下,其中已經將[財富=有錢]的特徵剔除;對根節點進行劃分時,選擇最好的劃分特徵是第一個,即"人品":

print(splitDataSet(dataSet,0,1))
[[1, 1, '見'], [0, 1, '見'], [0, 0, '不見']]
print(chooseBestFeatTopSplit(dataSet))
1

5. 構建決策樹

這個明天再寫 目前沒搞懂 前面的也沒全搞懂

參考的微信公眾號:AlgorithmDeveloper裡面的例子

侵權聯絡我刪除