覺(jué)得有用的請(qǐng)先點(diǎn)贊后收藏!不要只收藏不點(diǎn)贊!
例子:
一、信息量
:
假設(shè)中國(guó)足球隊(duì)和巴西足球隊(duì)曾經(jīng)有過(guò)8次比賽,其中中國(guó)隊(duì)勝1次。以U表示未來(lái)的中巴比賽中國(guó)隊(duì)勝的事件,那么U的先驗(yàn)概率就是1/8,因此其信息量就是
如果以 U  ̄ \overline{U} U 表示巴西隊(duì)勝,那么 U  ̄ \overline{U} U的先驗(yàn)概率是 7 8 \frac{7}{8} 87?,其信息量就是
:
二、信息熵
:

三、信息增益
樣本集合的信息熵越大,說(shuō)明各樣本相對(duì)均衡,區(qū)別就越小,越不利于分類。
劃分前后信息熵的減少量稱為信息增益
G
i
n
i
(
A
,
F
(
j
)
=
f
)
=
H
(
A
)
?
H
(
A
,
F
(
j
)
=
f
)
=
H
(
A
)
?
(
∣
A
1
∣
∣
A
∣
H
(
A
1
)
+
∣
A
2
∣
∣
A
∣
H
(
A
2
)
)
,
其中
F
(
j
)
是特征集
F
中第
j
個(gè)特征
f
Gini(A,F^{(j)}=f)\\=H(A)-H(A,F^{(j)}=f)\\=H(A)-\biggl(\frac{\bigl|A_1\bigr|}{\big|A\big|}H(A_1)+\frac{\big|A_2\big|}{\big|A\big|}H(A_2)\biggr),\textcolor{Red}{其中F^{(j)}是特征集F中第j個(gè)特征f}
Gini(A,F(j)=f)=H(A)?H(A,F(j)=f)=H(A)?(
?A
?
?A1?
??H(A1?)+
?A
?
?A2?
??H(A2?)),其中F(j)是特征集F中第j個(gè)特征f
∵
信息熵減少越多,說(shuō)明區(qū)別越大,越有利于分類
\because 信息熵減少越多,說(shuō)明區(qū)別越大,越有利于分類
∵信息熵減少越多,說(shuō)明區(qū)別越大,越有利于分類
∴
所以信息增益大的,有利于分類
\therefore所以信息增益大的,有利于分類
∴所以信息增益大的,有利于分類
解釋:先把樣本分為本科(
3
5
\frac{3}{5}
53?)和碩博(
2
5
\frac{2}{5}
52?),然后3個(gè)本科里面2個(gè)不相親,1個(gè)相親(
2
3
×
log
?
2
2
3
+
1
3
×
log
?
2
1
3
\frac{2}{3}\times\log_{2}{\frac{2}{3}}+\frac{1}{3}\times\log_{2}{\frac{1}{3}}
32?×log2?32?+31?×log2?31?),2個(gè)碩博里面都相親
log
?
2
1
\log_{2}{1}
log2?1
:
∵ 前面計(jì)算得到 H ( A ) = 0.971 , H ( A , F ( 2 ) = 碩士 ) = 0.551 \because 前面計(jì)算得到H(A)=0.971,H(A,F^{(2)}=碩士)=0.551 ∵前面計(jì)算得到H(A)=0.971,H(A,F(2)=碩士)=0.551
∴ G i n i ( A , F ( 2 ) = 碩士 ) = H ( A ) ? H ( A , F ( 2 ) = 碩士 ) = 0.97 ? 0.551 = 0.42 \therefore Gini(A,F^{(2)}=碩士)\\=H(A)-H(A,F^{(2)}=碩士)\\=0.97-0.551=0.42 ∴Gini(A,F(2)=碩士)=H(A)?H(A,F(2)=碩士)=0.97?0.551=0.42
四、基尼指數(shù)
此概率的基尼分布指數(shù)為:
對(duì)于樣本集A,其基尼指數(shù)為:

書(shū)本原話:基尼指數(shù)也是一種不等性度量的指標(biāo),取值介于0-1之間,分類越不平衡,基尼指數(shù)就越小。
事實(shí)上,如果選擇某一個(gè)特征來(lái)劃分子集,其基尼指數(shù)越小,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類?。?
\bold{事實(shí)上,如果選擇某一個(gè)特征來(lái)劃分子集,其基尼指數(shù)越小,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類?。
事實(shí)上,如果選擇某一個(gè)特征來(lái)劃分子集,其基尼指數(shù)越小,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類??!
利用學(xué)歷特征的決策值為“碩士”時(shí)劃分樣本集為兩個(gè)子集,基尼指數(shù)為(結(jié)合式(4-1)和式(4-2))
然后
五、建立決策樹(shù)
思路
1
:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合基尼指數(shù)最小的那個(gè)特征及其決策值作為分裂點(diǎn)。
\bold{思路1:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合基尼指數(shù)最小的那個(gè)特征及其決策值作為分裂點(diǎn)。}
思路1:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合基尼指數(shù)最小的那個(gè)特征及其決策值作為分裂點(diǎn)。
思路
2
:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合信息增益數(shù)最大的那個(gè)特征及其決策值作為分裂點(diǎn)。
\bold{思路2:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合信息增益數(shù)最大的那個(gè)特征及其決策值作為分裂點(diǎn)。}
思路2:在樣本集分裂時(shí),要選擇使分開(kāi)后兩個(gè)集合信息增益數(shù)最大的那個(gè)特征及其決策值作為分裂點(diǎn)。
案例一:相親案例(本博客的內(nèi)容,思路2)
編號(hào) | 年齡 | 身高 | 學(xué)歷 | 月收入 | 是否相親(標(biāo)簽) |
1 | 35 | 176 | 本科 | 20000 | 否 |
2 | 28 | 178 | 碩士 | 10000 | 是 |
3 | 26 | 172 | 本科 | 25000 | 否 |
4 | 29 | 173 | 博士 | 20000 | 是 |
5 | 28 | 174 | 本科 | 15000 | 是 |
先選擇樣本中所有的特征
F
(
i
)
,
i
從
0
到特征數(shù)減
1
,也就是
i
∈
[
0
,
l
e
n
(
F
)
?
1
]
F^{(i)},i從0到特征數(shù)減1,也就是i\in[ 0 , len(F) - 1]
F(i),i從0到特征數(shù)減1,也就是i∈[0,len(F)?1],接著對(duì)該正在遍歷的特征
F
(
i
)
F^{(i)}
F(i)里面每個(gè)樣本的每一個(gè)的這個(gè)特征值
F
e
a
t
u
r
e
?
v
a
l
u
e
(
i
)
Feature-value^{(i)}
Feature?value(i)進(jìn)行計(jì)算它的
信息增益
/
基尼指數(shù)
\bold{信息增益/基尼指數(shù)}
信息增益/基尼指數(shù),比如我利用信息增益來(lái)劃分區(qū)分度,因?yàn)?font color="red">
信息增益越大,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類!
\bold{信息增益越大,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類!}
信息增益越大,說(shuō)明劃分得越明確,劃分的純度越高!越有利于分類!,然后我用年齡這個(gè)特征,計(jì)算35歲,28歲,26歲,29歲,28歲的信息增益,發(fā)現(xiàn)28歲劃分年齡樣本時(shí),28歲在年齡特征的信息增益最大,劃分最明確,因此我用一個(gè)結(jié)果保存年齡的信息增益
c
u
r
I
n
f
o
←
0.32
,
b
e
s
t
I
n
f
o
←
0.32
curInfo\gets0.32,bestInfo\gets0.32
curInfo←0.32,bestInfo←0.32然后遍歷第二個(gè)特征,比如說(shuō)是學(xué)歷,然后計(jì)算本科,碩士,博士的信息增益,得到碩士的信息增益最大,curInfo=0.42,
∵
c
u
r
I
n
f
o
學(xué)歷
=
0.42
>
b
e
s
t
I
n
f
o
年齡
=
0.32
∴
b
e
s
t
I
n
f
o
←
c
u
r
I
n
f
o
∴
b
e
s
t
I
n
f
o
←
0.42
,
最后遍歷完所有特征后,選擇所有特征里面信息增益最大的那個(gè)特征,然后把
\because curInfo_{學(xué)歷}=0.42>bestInfo_{年齡}=0.32 \\ \therefore bestInfo\gets curInfo \\ \therefore bestInfo \gets 0.42,\\最后遍歷完所有特征后,選擇所有特征里面信息增益最大的那個(gè)特征,然后把
∵curInfo學(xué)歷?=0.42>bestInfo年齡?=0.32∴bestInfo←curInfo∴bestInfo←0.42,最后遍歷完所有特征后,選擇所有特征里面信息增益最大的那個(gè)特征,然后把
樣本根據(jù)當(dāng)前信息增益最大的特征劃分的樣本,比如有左子集lson,右子集rson,其中當(dāng)前節(jié)點(diǎn)是關(guān)于學(xué)歷得特征(一開(kāi)始計(jì)算得到學(xué)歷的信息增益最大),就把本科劃分到lson,碩博劃分到rson,然后在左子樹(shù)里面遞歸建樹(shù)(只在本科里面進(jìn)行下一步劃分),在右子樹(shù)里面遞歸建樹(shù)(只在碩博里面進(jìn)行下一步劃分),最后完成建立分類樹(shù)!
其中如果樣本數(shù)越多,則分類樹(shù)高度也更高,因?yàn)檫@是逐步細(xì)分的,比如我有一大堆的二維坐標(biāo), u = ( x , y ) , x ∈ [ 0 , 100 ] , y ∈ [ 0 , 100 ] u=(x,y),x\in[0,100],y\in[0,100] u=(x,y),x∈[0,100],y∈[0,100],那么分類樹(shù)可能會(huì)把這堆二維坐標(biāo)劃分為 x ∈ [ 0 , 50 ] , x ∈ ( 50 , 100 ] x\in[0,50],x\in(50,100] x∈[0,50],x∈(50,100],然后再次細(xì)分為 x ∈ [ 0 , 25 ] , x ∈ ( 25 , 50 ] , 至于實(shí)際上分類樹(shù)怎么分類,取決于樣本的基尼指數(shù),分類樹(shù)肯定先選擇基尼指數(shù)小 / 信息增益更大的特征 x\in[0,25],x\in(25,50],至于實(shí)際上分類樹(shù)怎么分類,取決于樣本的基尼指數(shù),分類樹(shù)肯定先選擇基尼指數(shù)小/信息增益更大的特征 x∈[0,25],x∈(25,50],至于實(shí)際上分類樹(shù)怎么分類,取決于樣本的基尼指數(shù),分類樹(shù)肯定先選擇基尼指數(shù)小/信息增益更大的特征
案例二:貸款案例(b站一個(gè)up列舉的例子,思路1)
編號(hào) | 有房者 | 婚姻 | 年收入 | 拖欠貸款(標(biāo)簽) |
1 | 是 | 單身 | 125k | 否 |
2 | 否 | 已婚 | 100k | 否 |
3 | 否 | 單身 | 70k | 否 |
4 | 是 | 已婚 | 120k | 否 |
5 | 否 | 離異 | 95k | 是 |
6 | 否 | 已婚 | 60k | 否 |
7 | 是 | 離異 | 220k | 否 |
8 | 否 | 單身 | 85k | 是 |
9 | 否 | 已婚 | 75k | 否 |
10 | 否 | 單身 | 90k | 是 |
G
i
n
i
(
A
,
F
(
0
)
=
是否有房
)
=
12
35
=
0.343
Gini(A,F^{(0)}={是否有房})=\frac{12}{35}=0.343
Gini(A,F(0)=是否有房)=3512?=0.343
G
i
n
i
(
A
,
F
(
1
)
=
是否婚姻
)
=
3
10
=
0.3
Gini(A,F^{(1)}={是否婚姻})=\frac{3}{10}=0.3
Gini(A,F(1)=是否婚姻)=103?=0.3
G
i
n
i
(
A
,
F
(
2
)
=
年薪
>
80
k
)
=
12
35
=
0.343
Gini(A,F^{(2)}=年薪\gt{80k})=\frac{12}{35}=0.343
Gini(A,F(2)=年薪>80k)=3512?=0.343是否結(jié)婚
這個(gè)特征劃分的子集的基尼指數(shù)最小,因此選擇是否結(jié)婚
來(lái)劃分子集,建立根節(jié)點(diǎn)
然后發(fā)現(xiàn)已婚的的都不欠款,因此不需要再劃分子集,然后單身和離異這部分的人可以繼續(xù)劃分,在這個(gè)
單身和離異這
6
個(gè)人當(dāng)中
\bold{單身和離異這6個(gè)人當(dāng)中}
單身和離異這6個(gè)人當(dāng)中計(jì)算是否有房
和年收入是否大于80k
來(lái)建立決策樹(shù),
在這六個(gè)人當(dāng)中,
G
i
n
i
(
A
,
F
(
0
)
=
房
)
=
1
4
Gini(A,F^{(0)}=房)=\frac{1}{4}
Gini(A,F(0)=房)=41?
G
i
n
i
(
A
,
F
(
2
)
=
收入
)
=
2
5
Gini(A,F^{(2)}=收入)=\frac{2}{5}
Gini(A,F(2)=收入)=52?
因此第二個(gè)特征選擇較小者,第二個(gè)特征應(yīng)該選擇是否有房
,因?yàn)橹挥腥齻€(gè)特征,所以最后一個(gè)特征只能選擇年收入是否大于80k
來(lái)建立決策樹(shù)
第五節(jié)內(nèi)容來(lái)自下面這個(gè)視頻鏈接!點(diǎn)擊我->視頻鏈接
【數(shù)據(jù)挖掘】決策樹(shù)零基礎(chǔ)入門(mén)教程,手把手教你學(xué)決策樹(shù)!
六、代碼:信息熵,信息增益,基尼指數(shù)計(jì)算
splitInfo.py
# coding:UTF-8
import math
def sum_of_each_label(samples):
'''
統(tǒng)計(jì)樣本集中每一類標(biāo)簽label出現(xiàn)的次數(shù)
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label
retrurn sum_of_each_label:dictionary,各類樣本的數(shù)量
'''
labels = [sample[-1] for sample in samples] #sample是相親的一個(gè)人的個(gè)人信息,最后一個(gè)代表是否相親成功
sum_of_each_label = dict([(i,labels.count(i)) for i in labels])#labels是列表,count(i)是計(jì)算i在列表labels里面出現(xiàn)的次數(shù)
return sum_of_each_label
#返回一個(gè)字典,
# 字典內(nèi)容如 0->2,1->3,表示0出現(xiàn)2次,1出現(xiàn)3次
def info_entropy(samples):
'''
計(jì)算樣本集的信息熵
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label
return infoEntropy:float,樣本集的信息熵
'''
# 統(tǒng)計(jì)每類標(biāo)簽的數(shù)量
label_counts = sum_of_each_label(samples)
# 計(jì)算信息熵 infoEntropy = -∑(p * log(p))
infoEntropy = 0.0
sumOfSamples = len(samples)
for label in label_counts:
p = float(label_counts[label])/sumOfSamples
infoEntropy -= p * math.log(p,2)
return infoEntropy
def split_samples(samples, f, fvalue):
'''
切分樣本集
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label,其它項(xiàng)為特征
para f: int,切分的特征,用樣本中的特征次序表示
para fvalue: float or int,切分特征的決策值
output lsamples: list, 切分后的左子集
output rsamples: list, 切分后的右子集
'''
lsamples = []
rsamples = []
for s in samples:#s是相親的一個(gè)人的個(gè)人信息,f是切分特征
if s[f] < fvalue:
lsamples.append(s)
else:
rsamples.append(s)
return lsamples, rsamples
def info_gain(samples, f, fvalue):
'''
計(jì)算切分后的信息增益
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label,其它項(xiàng)為特征
para f: int,切分的特征,用樣本中的特征次序表示
para fvalue: float or int,切分特征的決策值
output : float, 切分后的信息增益
'''
lson, rson = split_samples(samples, f, fvalue)
return info_entropy(samples) - (info_entropy(lson)*len(lson) + info_entropy(rson)*len(rson))/len(samples)
def gini_index(samples):
'''
計(jì)算樣本集的Gini指數(shù)
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label,其它項(xiàng)為特征
output: float, 樣本集的Gini指數(shù)
'''
sumOfSamples = len(samples)
if sumOfSamples == 0:
return 0
label_counts = sum_of_each_label(samples)
gini = 0
for label in label_counts:
gini = gini + pow(label_counts[label], 2)
return 1 - float(gini) / pow(sumOfSamples, 2)
def gini_index_splited(samples, f, fvalue):
'''
計(jì)算切分后的基尼指數(shù)
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label,其它項(xiàng)為特征
para f: int,切分的特征,用樣本中的特征次序表示
para fvalue: float or int,切分特征的決策值
output : float, 切分后的基尼指數(shù)
'''
lson, rson = split_samples(samples, f, fvalue)
return (gini_index(lson)*len(lson) + gini_index(rson)*len(rson))/len(samples)
if __name__ == "__main__":
# 表3-1 某人相親數(shù)據(jù),依次為年齡、身高、學(xué)歷、月薪特征和是否相親標(biāo)簽
blind_date = [[35, 176, 0, 20000, 0],
[28, 178, 1, 10000, 1],
[26, 172, 0, 25000, 0],
[29, 173, 2, 20000, 1],
[28, 174, 0, 15000, 1]]
# 計(jì)算集合的信息熵
print(info_entropy(blind_date))
# OUTPUT:0.9709505944546686
# 計(jì)算集合的信息增益
print(info_gain(blind_date,1,175)) # 按身高175切分
# OUTPUT:0.01997309402197478
print(info_gain(blind_date,2,1)) # 按學(xué)歷是否碩士切分
# OUTPUT:0.4199730940219748
print(info_gain(blind_date,3,10000)) # 按月薪10000切分
# OUTPUT:0.0
# 計(jì)算集合的基尼指數(shù)
print(gini_index(blind_date))
# OUTPUT:0.48
# 計(jì)算切分后的基尼指數(shù)
print(gini_index_splited(blind_date,1,175)) # 按身高175切分
# OUTPUT:0.4666666666666667
print(gini_index_splited(blind_date,2,1)) # 按學(xué)歷是否碩士切分
# OUTPUT:0.26666666666666666
print(gini_index_splited(blind_date,3,10000)) # 按月薪10000切分
# OUTPUT:0.48
print(gini_index_splited(blind_date,0,30)) # 按年齡30切分
# OUTPUT:0.3
decision_bitree.py
# coding:UTF-8
from splitInfo import info_entropy, gini_index, split_samples, sum_of_each_label
class biTree_node:
'''
二叉樹(shù)節(jié)點(diǎn)
'''
def __init__(self, f=-1, fvalue=None, leafLabel=None, l=None, r=None, splitInfo="gini"):
'''
類初始化函數(shù)
para f: int,切分的特征,用樣本中的特征次序表示
para fvalue: float or int,切分特征的決策值
para leafLable: int,葉節(jié)點(diǎn)的標(biāo)簽
para l: biTree_node指針,內(nèi)部節(jié)點(diǎn)的左子樹(shù)
para r: biTree_node指針,內(nèi)部節(jié)點(diǎn)的右子樹(shù)
para splitInfo="gini": string, 切分的標(biāo)準(zhǔn),可取值'infogain'和'gini',分別表示信息增益和基尼指數(shù)
'''
self.f = f
self.fvalue = fvalue
self.leafLabel = leafLabel
self.l = l
self.r = r
self.splitInfo = splitInfo
def build_biTree(samples, splitInfo="gini"):
'''構(gòu)建樹(shù)
para samples:list,樣本的列表,每樣本也是一個(gè)列表,樣本的最后一項(xiàng)為label,其它項(xiàng)為特征
para splitInfo="gini": string, 切分的標(biāo)準(zhǔn),可取值'infogain'和'gini',分別表示信息增益和基尼指數(shù)
return biTree_node:Class biTree_node,二叉決策樹(shù)的根結(jié)點(diǎn)
'''
if len(samples) == 0:
return biTree_node()
if splitInfo != "gini" and splitInfo != "infogain":
return biTree_node()
bestInfo = 0.0
bestF = None
bestFvalue = None
bestlson = None
bestrson = None
if splitInfo == "gini":
curInfo = gini_index(samples) # 當(dāng)前集合的基尼指數(shù)
else:
curInfo = info_entropy(samples) # 當(dāng)前集合的信息熵
sumOfFeatures = len(samples[0]) - 1 # 樣本中特征的個(gè)數(shù)
for f in range(0, sumOfFeatures): # 遍歷每個(gè)特征
featureValues = [sample[f] for sample in samples]
for fvalue in featureValues: # 遍歷當(dāng)前特征的每個(gè)值
lson, rson = split_samples(samples, f, fvalue)
if splitInfo == "gini":
# 計(jì)算分裂后兩個(gè)集合的基尼指數(shù)
info = (gini_index(lson) * len(lson) + gini_index(rson) * len(rson)) / len(samples)
else:
# 計(jì)算分裂后兩個(gè)集合的信息熵
info = (info_entropy(lson) * len(lson) + info_entropy(rson) * len(rson)) / len(samples)
gain = curInfo - info # 計(jì)算基尼指數(shù)減少量或信息增益
# 能夠找到最好的切分特征及其決策值,左、右子樹(shù)為空說(shuō)明是葉子節(jié)點(diǎn)
if gain > bestInfo and len(lson) > 0 and len(rson) > 0:
bestInfo = gain
bestF = f
bestFvalue = fvalue
bestlson = lson
bestrson = rson
if bestInfo > 0.0:
l = build_biTree(bestlson)
r = build_biTree(bestrson)
return biTree_node(f=bestF, fvalue=bestFvalue, l=l, r=r, splitInfo=splitInfo)
else: # 如果bestInfo==0.0,說(shuō)明沒(méi)有切分方法使集合的基尼指數(shù)或信息熵下降了,說(shuō)明這個(gè)sample樣本里面非常純了,
#只有1類標(biāo)簽,要么全是0,要么全是1,要么全是相親的,要么全都不相親!
label_counts = sum_of_each_label(samples)
# 返回該集合中最多的類別作為葉子節(jié)點(diǎn)的標(biāo)簽
return biTree_node(leafLabel=max(label_counts, key=label_counts.get), splitInfo=splitInfo)
def predict(sample, tree):
'''
對(duì)樣本sample進(jìn)行預(yù)測(cè)
para sample:list,需要預(yù)測(cè)的樣本
para tree:biTree_node,構(gòu)建好的分類樹(shù)
return: biTree_node.leafLabel,所屬的類別
'''
# 1、只是樹(shù)根
if tree.leafLabel != None:
return tree.leafLabel
else:
# 2、有左右子樹(shù)
sampleValue = sample[tree.f]
branch = None
if sampleValue >= tree.fvalue:
branch = tree.r
else:
branch = tree.l
return predict(sample, branch)
def print_tree(tree, level='0'):
'''簡(jiǎn)單打印一顆樹(shù)的結(jié)構(gòu)
para tree:biTree_node,樹(shù)的根結(jié)點(diǎn)
para level='0':str, 節(jié)點(diǎn)在樹(shù)中的位置,用一串字符串表示,0表示根節(jié)點(diǎn),0L表示根節(jié)點(diǎn)的左孩子,0R表示根節(jié)點(diǎn)的右孩子
'''
if tree.leafLabel != None:
print('*' + level + '-' + str(tree.leafLabel)) # 葉子節(jié)點(diǎn)用*表示,并打印出標(biāo)簽
else:
print('+' + level + '-' + str(tree.f) + '-' + str(tree.fvalue)) # 中間節(jié)點(diǎn)用+表示,并打印出特征編號(hào)及其劃分值
print_tree(tree.l, level + 'L')
print_tree(tree.r, level + 'R')
if __name__ == "__main__":
# 表3-1 某人相親數(shù)據(jù)
blind_date = [[35, 176, 0, 20000, 0],
[28, 178, 1, 10000, 1],
[26, 172, 0, 25000, 0],
[29, 173, 2, 20000, 1],
[28, 174, 0, 15000, 1]]
print("信息增益二叉樹(shù):")
tree = build_biTree(blind_date, splitInfo="infogain")
print_tree(tree)
print('信息增益二叉樹(shù)對(duì)樣本進(jìn)行預(yù)測(cè)的結(jié)果:')
test_sample = [[24, 178, 2, 17000],
[27, 176, 0, 25000],
[27, 176, 0, 10000]]
for x in test_sample:
print(predict(x, tree))
print("基尼指數(shù)二叉樹(shù):")
tree = build_biTree(blind_date, splitInfo="gini")
print_tree(tree)
print('基尼指數(shù)二叉樹(shù)對(duì)樣本進(jìn)行預(yù)測(cè)的結(jié)果:')
test_sample = [[24, 178, 2, 17000],
[27, 176, 0, 25000],
[27, 176, 0, 10000]]
for x in test_sample:
print(predict(x, tree))
代碼運(yùn)行結(jié)果分析
*表示了這個(gè)節(jié)點(diǎn)是葉子節(jié)點(diǎn),0是根節(jié)點(diǎn),0L是根節(jié)點(diǎn)的左孩子,0R是根節(jié)點(diǎn)的右孩子,0LL是根節(jié)點(diǎn)的左孩子的左孩子,1表示相親,0表示不相親。
+0-2-1 ,根節(jié)點(diǎn)表示首選選擇第二特征學(xué)歷,,因?yàn)闃颖敬a里面0代表本科,1碩士,2表示博士,所以碩博優(yōu)先
+0L-3-20000,0L表示根節(jié)點(diǎn)右孩子,3是表示月收入(詳細(xì)看代碼),20000月收入是一個(gè)特征值的篩選
*0LL-1,0LL是根節(jié)點(diǎn)的左孩子的左孩子,因?yàn)?是葉子節(jié)點(diǎn)所以1是標(biāo)簽,表示相親
*0LR-0,0LR是根節(jié)點(diǎn)的左孩子的右孩子,因?yàn)?是葉子節(jié)點(diǎn)所以0是標(biāo)簽,表示不相親
*0R-1,0R的意思是根節(jié)點(diǎn)有孩子,因?yàn)?是葉子節(jié)點(diǎn)所以1是標(biāo)簽,表示相親
詳細(xì)意思看下面這樣圖的解釋(要和代碼一起理解哦?。?br>文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-793056.html
七,代碼中的語(yǔ)法說(shuō)明
鏈接??:max(label_counts, key=label_counts.get)的理解文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-793056.html
到了這里,關(guān)于決策樹(shù)分類算法(一)(信息熵,信息增益,基尼指數(shù)計(jì)算)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!