李航 統計學習 採用C4 5演算法構建決策樹

2021-08-14 17:15:41 字數 3347 閱讀 2193

from numpy import *

from math import log

import operator

def calcshannonent(dataset):

numdataset=len(dataset)

labelcount={}

for data in dataset:

curlabel=data[-1]

if curlabel not in labelcount.keys():

labelcount[curlabel]=0

labelcount[curlabel]+=1

shannonent=0.0

for key in labelcount:

prob=float(labelcount[key])/numdataset

shannonent-=prob*log(prob,2)

return shannonent

def creatdataset():

dataset=[['青年','否','否','一般','否'],

['青年','否','否','好','否'],

['青年','是','否','好','是'],

['青年','是','是','一般','是'],

['青年','否','否','一般','否'],

['中年','否','否','一般','否'],

['中年','否','否','好','否'],

['中年','是','是','好','是'],

['中年','否','是','非常好','是'],

['中年','否','是','非常好','是'],

['老年','否','是','非常好','是'],

['老年','否','是','好','是'],

['老年','是','否','好','是'],

['老年','是','否','非常好','是'],

['老年','否','否','一般','否']]

label=['年齡','有工作','有自己的房子','信貸情況']

return dataset,label

def splitdataset(dataset,axis,value):

retdataset=

for featvec in dataset:

if featvec[axis] == value:

redfeatvec=featvec[:axis]

redfeatvec.extend(featvec[axis+1:])

return retdataset

# 與id3的區別主要在該程式塊中體現

def choosebestfeaturntosplit(dataset):

numfeature=len(dataset[0])-1

baseentropy=calcshannonent(dataset)

bestinfogain=0.0

bestfeature=-1

for i in range(numfeature):

features=[example[i] for example in dataset]

uniquevals=set(features)

newentropy=0.0

splitinfo=0.0

for value in uniquevals:

subdataset=splitdataset(dataset,i,value)

prob=len(subdataset)/float(len(dataset))

newentropy+=prob*calcshannonent(subdataset)

splitinfo-=prob*log(prob,2)

infocain=(baseentropy-newentropy)/splitinfo

if infocain>bestinfogain:

bestinfogain=infocain

bestfeature=i

return bestfeature

# return label[bestfeature]

def majority(classlist):

classcount={}

for vote in classlist:

if vote not in classcount.keys():

classcount[vote]=0

classcount+=1

sortedclasscount=sorted(classcount,key=operator.itemgetter(1),reverse=true)

return sortedclasscount[0][0]

def createtree(dataset,labels):

classlist=[example[-1] for example in dataset]

if classlist.count(classlist[0])==len(classlist):

return classlist[0]

if len(dataset[0])==1:

return majority(classlist)

bestfeat=choosebestfeaturntosplit(dataset)

bestfeatlabel=labels[bestfeat]

mytree=}

del(labels[bestfeat])

featvalues=[example[bestfeat] for example in dataset]

uniqualvals=set(featvalues)

for value in uniqualvals:

mytree[bestfeatlabel][value]=createtree(splitdataset(dataset,bestfeat,value),labels)

return mytree

dataset,labels=creatdataset()

# print(dataset,labels)

shannonent=calcshannonent(dataset)

print(shannonent)

bestfeature=choosebestfeaturntosplit(dataset)

print(bestfeature)

mytree=createtree(dataset,labels)

print(mytree)

關於該演算法的理論部分參照李航統計方法決策樹部分,**部分參考機器學習實戰,並對其進行改進,以c4,5演算法形式展示出來

《統計學習方法》 李航 學習大綱

最近在學習李航寫的統計學習方法概論,每一章都用xmind理清了思路,括號裡是書裡的公式,第一次寫博文,敬請指教 第一章 統計學習方 第二章 感知機 每個方法其實只需要著重掌握三要素和輸入輸出就可以了,主要看模型 策略和演算法。感知機主要是二類分類的線性分類模型。看到後面會注意感知機和支援向量機的區別...

維特比演算法實現 李航《統計學習方法》

維特比演算法實現 參考 李航 統計學習方法 p208 author xueqing,2019 08 19 輸入 a 盒子狀態轉移矩陣 b 觀測概率矩陣 pi 初始概率分布 ou 觀測序列 a 0.5,0.2,0.3 0.3,0.5,0.2 0.2,0.3,0.5 b 0.5,0.5 0.4,0.6 ...

李航《統計學習方法》 感知機

這一章就講了感知機。我覺得是深受工業革命的影響,把一些可以實現功能的基本單元都喜歡叫做什麼機,這裡的感知機,還有後來的以感知機為基礎的支援向量機。直接看定義,看本質,實際上,感知機是一種線性分類模型。下面就以這句話為中心仔細闡述一下。什麼叫線性。線性liner,正如其名,兩個變數的關係的函式是一條直...