題目要求:根據訓練資料集,利用資訊增益比(c4.5演算法)生成決策樹。
資訊增益比演算法是id3演算法的改進:
資訊增益比的定義:
補充:資訊增益計算方式:
**實現(機器學習實戰的改編,儲存為tree.py):
from math import log
import operator
def createdataset():
dataset = [1,0,0,1,0],\
[1,0,0,2,0],\
[1,1,0,2,1],\
[1,1,1,1,1],\
[1,0,0,1,0],\
[2,0,0,1,0],\
[2,0,0,2,0],\
[2,1,1,2,1],\
[2,0,1,3,1],\
[2,0,1,3,1],\
[3,0,1,3,1],\
[3,0,1,2,1],\
[3,1,0,2,1],\
[3,1,0,3,1],\
[3,0,0,1,0]
labels = ['age','job','house','creadit']
return dataset, labels
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:
reducedfeatvec = featvec[:axis]
reducedfeatvec.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]
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) / baseentropy
if (infogain > bestinfogain):
bestinfogain = infogain
bestfeature = i
return bestfeature
def majoritycnt(classlist):
classcount = {}
for vote in classlist:
if vote not in classcount.keys():
classcount[vote] = 0
classcount[vote] += 1
sortedclasscount = sorted(classcount.iteritems(), 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 majoritycnt(classlist)
bestfeat = choosebestfeaturetosplit(dataset)
bestfeatlabel = labels[bestfeat]
mytree = }
del (labels[bestfeat])
featvalues = [example[bestfeat] for example in dataset]
uniquevals = set(featvalues)
for value in uniquevals:
sublabels = labels[:]
mytree[bestfeatlabel][value] = createtree(splitdataset(dataset, bestfeat, value), sublabels)
return mytree
呼叫方式:
import tree
mydat,mylab = tree.createdataset()
mytree = tree.createtree(mydat,mylab)
print mytree
結果和id3演算法效果一樣: 統計學習方法 1 統計學習方法概論
統計學習的主要特點是 1 統計學習以計算機及網路為平台,是建立在計算機及網路之上的 2 統計學習以資料為研究物件,是資料驅動的學科 3 統計學習的目的是對資料進行 與分析 4 統計學習以方法為中心,統計學習方法構建模型並應用模型進行 與分析 5 統計學習是概率論 統計學 資訊理論 計算理論 最優化理...
統計學習方法
這兩天翻了一下這本書,做個筆記,方便下次細看。本書主要講解統計學習中用到的監督學習。介紹了一些模型機器演算法。當參考書不錯,不怎麼適合死磕。第一章 主要介紹機器學習,統計學習的基本步驟,以及常用的表示方法。寫的比較系統,對於這個比較不熟悉的,可以好好看看。因為常用的模型就是這樣表示的,懂了這個看公式...
統計學習方法
第一章 方法概述 統計學習方法三要素 模型,策略,演算法 監督學習的重要問題 分類問題 classification 應用 銀行構建客戶分類模型,網路安全利用日誌資料對入侵檢測,影象處理檢測影象中是否有人臉,手寫識別識別分類手寫數字,網際網路搜尋網頁分類 二類分類評價指標 精確度,召回率,f1值 標...