emmmmmm....有點燒腦子
決策樹,通俗的理解就是根據每個問題進行判斷,然後最終往下找到答案的過程,類似於一棵樹,可以用下圖(相親物件的選擇)來理解:
獲得一棵決策樹,首先要求的最優資訊增益,資訊增益就是求前邊每一列對最最後一列這個可能標籤的約束程度,熵代表了最後一列標籤取值的隨機性(貌似這樣吧,我是小渣渣自己這樣理解的,頭都大了),下圖可以看出每種資訊增益的情況,可以理解為用哪種特徵劃分比較合適:
資料集,前四列為'年齡', '有工作', '有自己的房子', '信貸情況',最後一列為是否貸款給這個人
下列**可以分為幾個步驟:
1.建立如上資料集
2.計算最後一列標籤取值的隨機性,即求熵(p代表情況xi在總情況所佔的比例)
3.操作前邊的特徵列(該例子有四個特徵),根據取值情況,計算每一列的資訊增益
4.比較求得最優資訊增益
from math import log
"""計算夏農熵"""
def calcshannonent(dataset):
numentries = len(dataset)
labelcounts = {}
for featvec in dataset: # 遍歷每一行資料
currentlabel = featvec[-1] # 取最後一列
if currentlabel not in labelcounts.keys(): # 該可能標籤情況是否存在字典中
labelcounts[currentlabel] = 0 # 不存在就建立乙個
labelcounts[currentlabel] += 1
shannonent = 0.0
for key in labelcounts: # 遍歷每種可能標籤
prob = float(labelcounts[key]) / numentries # 每種的概率
shannonent -= prob * log(prob, 2) # 夏農熵計算公式
return shannonent
"""去掉某特徵對應的資料列"""
def splitdataset(dataset, axis, value): # 引數為全部資料,想要操作的列,想要刪除的值(將所有資料中中,取該列為這個值得行,並且去掉該列)
retdataset =
for featvec in dataset: # 遍歷每一行
if featvec[axis] == value: # 如果等於目標值
reducefeatvec = featvec[:axis] # 將這一行該列左邊儲存起來
reducefeatvec.extend(featvec[axis + 1:]) # 儲存這一行該列右邊
return retdataset
"""選擇最好的資料集劃分"""
def choosebestfeaturetosplit(dataset):
numfeatures = len(dataset[0]) - 1 # 特徵數量
baseentropy = calcshannonent(dataset) # 計算熵
bestinfogain = 0.0 # 儲存最後求得的資訊增益
bestfeature = -1 # 最優特徵的索引值
for i in range(numfeatures): # 遍歷所有特徵值的下標
featlist = [example[i] for example in dataset] # 乙個for迴圈,每行取第i個存入list,迴圈完後list中存的是第i列
uniquevals = set(featlist) # 建立對應集合,元素不可重複
newentropy = 0.0
for value in uniquevals:
subdataset = splitdataset(dataset, i, value) # 根據特徵值劃分好資料集
prob = len(subdataset) / float(len(dataset))
newentropy += prob * calcshannonent(subdataset)
infogain = baseentropy - newentropy # 求該列(特徵)對最後一列(可能標籤)的資訊增益
print("第%d個特徵的增益為%.3f" % (i, infogain)) # 列印每個特徵的資訊增益
if (infogain > bestinfogain):
bestinfogain = infogain # 通過比較取最優資訊增益
bestfeature = i # 最優資訊增益對應的列
return bestfeature
"""建立資料集"""
def createdataset():
dataset = [[0, 0, 0, 0, 'no'], # 資料集
[0, 0, 0, 1, 'no'],
[0, 1, 0, 1, 'yes'],
[0, 1, 1, 0, 'yes'],
[0, 0, 0, 0, 'no'],
[1, 0, 0, 0, 'no'],
[1, 0, 0, 1, 'no'],
[1, 1, 1, 1, 'yes'],
[1, 0, 1, 2, 'yes'],
[1, 0, 1, 2, 'yes'],
[2, 0, 1, 2, 'yes'],
[2, 0, 1, 1, 'yes'],
[2, 1, 0, 1, 'yes'],
[2, 1, 0, 2, 'yes'],
[2, 0, 0, 0, 'no']]
labels = ['年齡', '有工作', '有自己的房子', '信貸情況'] # 特徵標籤
return dataset, labels # 返回資料集和分類屬性
if __name__ == '__main__':
dataset, labels = createdataset()
bestfeature = choosebestfeaturetosplit(dataset)
print("最優資訊增益索引值為:%d"%bestfeature)
機器學習 決策樹 計算資訊增益
檔案說明 決策樹 from math import log 函式說明 建立測試資料集 parameters null returns dataset 資料集 labels 分類屬性 author zhengyuxiao modify 2019 03 04 def createdataset data...
決策樹資訊增益
決策樹和整合演算法都是樹模型 決策樹 從根節點一步步走到葉子節點,所有的資料都會落到葉子節點,既可以做分類也可以做回歸。一顆樹有三種節點組成,根節點,中間幾點,葉子節點。根節點是第乙個選擇節點,也是最重要的乙個選擇特徵。葉子節點是存放最終的結果。決策樹的訓練和測試 訓練是建立一棵樹。測試是讓資料從根...
資訊增益與決策樹
決策樹是一種判別式模型。在一顆分類決策樹中,非葉子節點時決策規則,葉子節點是類別。當輸入乙個特徵向量時,按照決策樹上的規則從根節點向葉節點移動,最後根據葉節點的類別判定輸入向量的類別。決策樹也可以用來解決回歸問題。建立乙個決策樹模型主要有三個步驟 特徵選擇 決策樹的生成 決策樹的剪枝。而特徵選擇時要...