AlgorithmDeveloper 決策樹演算法實現.md
阿新 • • 發佈:2018-12-11
以相親為例子
建立資料集
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 | 見 |
計算資訊熵
計算資訊熵,咱們首先得知道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演算法分別選擇資訊增益/資訊增益比最大的特徵對當前節點進行分類;這裡再回顧一下相關計算公式:
#按給定特徵劃分資料集:返回第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裡面的例子
侵權聯絡我刪除