劃分資料集最大的原則是:將無序的資料變得更加有序。我們可以使用多種方法劃分資料集,但是每種方法都有各自的優缺點。我們可以在劃分資料之前使用資訊理論量化度量資訊的內容。
在劃分資料集之前之後資訊發生的變化稱為資訊增益,知道如何計算資訊增益,我們就可以計算每個特徵值劃分資料集獲得的資訊增益,獲得資訊增益最高的特徵就是最好的選擇。
集合資訊的度量方式稱為夏農熵
#計算給定資料集的夏農熵
from math import log
defcalcshannonent
(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.0for key in labelcounts:
prob =
float
(labelcounts[key]
)/numentries
shannonent -= prob * log(prob,2)
return shannonent
dataset =[[
1,1,
'yes'],
[1,1
,'yes'],
[1,0
,'no'],
[0,1
,'no'],
[0,1
,'no']]
labelss =
['no su***cing'
,'flippers'
]
calcshannonent(dataset)
0.9287712379549449
##劃分資料集
#三個輸入引數:待劃分的資料集、劃分資料集的特徵、特徵的返回值
defsplitdataset
(dataset, axis, value)
: retdataset =
for featvec in dataset:
reducedfeatvec = featvec[
:axis]
reducedfeatvec.extend(featvec[axis+1:
])return retdataset
splitdataset(dataset,0,
1)
[[1, 'yes'], [1, 'yes'], [0, 'no'], [1, 'no'], [1, 'no']]
splitdataset(dataset,0,
0)
[[1, 'yes'], [1, 'yes'], [0, 'no'], [1, 'no'], [1, 'no']]
## 選擇最好的資料集劃分方式
#在函式中呼叫的資料需要滿足一定的要求:第乙個要
#求是,資料必須是一種由列表元素組成的列表,而且所有的列表元素都要具有相同的資料長度;
#第二個要求是,資料的最後一列或者每個例項的最後乙個元素是當前例項的類別標籤。
defchoosebestfeaturetosplit
(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.0for value in uniquevals:
subdataset = splitdataset(dataset, i, value)
prob =
len(subdataset)
/float
(len
(dataset)
) infogain = baseentropy - newentropy
if(infogain > bestinfogain)
: bestinfogain = infogain
bestfeature = i
return bestfeature
choosebestfeaturetosplit(dataset)
0
## 遞迴構建決策樹
import operator
defmajoritycnt
(classlist)
: classcount =
for vote in classlist:
if vote not
in classcount.keys():
classcount[vote]=0
classcount[vote]+=1
sortedclasscount =
sorted
(classcount.items(
), key = operator.itemgetter(1)
, reverse =
true
)return sortedclasscount[0]
[0]
## 建立樹的**
defcreatetree
(dataset, labels)
: classlist =
[example[-1
]for example in dataset]
if classlist.count(classlist[0]
)==len(classlist)
:#類別完全相同則停止劃分
return classlist[0]
iflen
(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
createtree(dataset, labelss)
},
1: }}}
決策樹之 ID3
id3 是一種用來構建決策樹的演算法,它根據資訊增益來進行屬性選擇。關於決策樹,請參見 此處主要介紹 id3 演算法如何利用資訊增益選擇屬性。資訊熵,簡稱 熵 假定訓練集中目標屬性為 c c的取值為 c1 c2,cm 每個取值佔的比例為p1 p2,pm 則資訊熵的定義為 en trop y s en...
決策樹之ID3
一組含n個例項的資料集,每乙個例項長為m,其中包括m 1個特徵 屬性 最後乙個為該特徵的類別標籤。在此種資料集的基礎上,有一棵樹,這棵樹上的非葉子節點均為某特徵,葉子節點均為其父節點特徵的特徵值。那麼這棵樹是怎麼來的?我們 1.首先要在當前資料集中找到最適合分組的乙個特徵,2.然後根據這個特徵值的不...
機器學習實戰 決策樹ID3
import matplotlib.pyplot as plt boxstyle是文字框型別 fc是邊框粗細 sawtooth是鋸齒形 xy是終點座標 xytext是起點座標 可能疑問 為什麼說是終點,但是卻是箭頭從這出發的?解答 arrowstyle decisionnode dict boxst...