国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

決策樹(shù)分類算法(一)(信息熵,信息增益,基尼指數(shù)計(jì)算)

這篇具有很好參考價(jià)值的文章主要介紹了決策樹(shù)分類算法(一)(信息熵,信息增益,基尼指數(shù)計(jì)算)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

覺(jué)得有用的請(qǐng)先點(diǎn)贊后收藏!不要只收藏不點(diǎn)贊!

例子:
如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

一、信息量

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類
:

I ( x ) = log ? 2 1 p = ? log ? 2 p I(x)=\log_{2}{\frac{1}{p}}=-\log_{2}{p} I(x)=log2?p1?=?log2?p

假設(shè)中國(guó)足球隊(duì)和巴西足球隊(duì)曾經(jīng)有過(guò)8次比賽,其中中國(guó)隊(duì)勝1次。以U表示未來(lái)的中巴比賽中國(guó)隊(duì)勝的事件,那么U的先驗(yàn)概率就是1/8,因此其信息量就是

I ( x ) = ? log ? 2 1 8 = 3 I(x)=-\log_{2}{\frac{1}{8}}=3 I(x)=?log2?81?=3

如果以 U  ̄ \overline{U} U 表示巴西隊(duì)勝,那么 U  ̄ \overline{U} U的先驗(yàn)概率是 7 8 \frac{7}{8} 87?,其信息量就是

:

I ( U  ̄ ) = ? l o g 2 ( 7 8 ) = 0.19 I(\overline{U})=-log_{2}(\frac{7}{8})=0.19 I(U)=?log2?(87?)=0.19

二、信息熵

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類
:

H ( X ) = E [ I ( x i ) ] = ? ∑ i = 1 n p i × log ? 2 p i H(X)=E[I(x_i)]=-\sum_{i=1}^{n}{p_i\times \log_2{p_i}} H(X)=E[I(xi?)]=?i=1n?pi?×log2?pi?

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

三、信息增益

樣本集合的信息熵越大,說(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所以信息增益大的,有利于分類 所以信息增益大的,有利于分類

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類
解釋:先把樣本分為本科( 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

:

H ( A 1 ) = ? 2 3 × log ? 2 2 3 ? 1 3 × log ? 2 1 3 H(A_1)=-\frac{2}{3}\times\log_{2}{\frac{2}{3}}-\frac{1}{3}\times\log_{2}{\frac{1}{3}} H(A1?)=?32?×log2?32??31?×log2?31?

H ( A 2 ) = log ? 2 1 H(A_2)=\log_{2}{1} H(A2?)=log2?1

H ( A , F ( 2 ) = 碩士 ) = 3 5 H ( A 1 ) + 2 5 H ( A 2 ) = 3 5 × ( ? 2 3 × log ? 2 2 3 ? 1 3 × log ? 2 1 3 ) + 2 5 × log ? 2 1 = 0.551 H(A,F^{(2)}=碩士)=\frac{3}{5}H(A_1)+\frac{2}{5}H(A_2)=\frac{3}{5}\times(-\frac{2}{3}\times\log_{2}{\frac{2}{3}}-\frac{1}{3}\times\log_{2}{\frac{1}{3}})+\frac{2}{5}\times\log_{2}{1}=0.551 H(A,F(2)=碩士)=53?H(A1?)+52?H(A2?)=53?×(?32?×log2?32??31?×log2?31?)+52?×log2?1=0.551

∵ 前面計(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ù)

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類
此概率的基尼分布指數(shù)為:

G i n i ( p ) = ∑ k = 1 K p k ( 1 ? p k ) = 1 ? ∑ k = 1 K p k 2 \textcolor{OrangeRed}{Gini(p)=\sum_{k=1}^{K}{p_k}{(1-p_k)}=1-\sum_{k=1}^{K}{p_{k}^2}} Gini(p)=k=1K?pk?(1?pk?)=1?k=1K?pk2? ···························· 式 ( 4 ? 1 ) 式(4-1) (4?1)

對(duì)于樣本集A,其基尼指數(shù)為:
G i n i ( p ) = 1 ? ∑ k = 1 K ( ∣ A k ∣ ∣ A ∣ ) 2 = 1 ? ∑ k = 1 K ∣ A k ∣ 2 ∣ A ∣ 2 Gini(p)=1-\sum_{k=1}^{K}{(\frac{| A_k |}{|A|})^2}=1-\frac{\sum_{k=1}^{K}{|A_k|}^2}{|A|^2} Gini(p)=1?k=1K?(AAk??)2=1?A2k=1K?Ak?2?

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(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))

G i n i ( A , F ( 2 ) = 碩士 ) = 3 5 × { 1 ? [ ( 2 3 ) 2 + ( 1 3 ) 2 ] } + 2 5 × { 1 ? ( 2 2 ) 2 } = 0.267 Gini(A,F^{(2)}=碩士)=\frac{3}{5}\times\lbrace 1-\lbrack (\frac{2}{3})^2+(\frac{1}{3})^2 \rbrack \rbrace+\frac{2}{5}\times\lbrace1-(\frac{2}{2})^2\rbrace=0.267 Gini(A,F(2)=碩士)=53?×{1?[(32?)2+(31?)2]}+52?×{1?(22?)2}=0.267

然后

G i n i ( A , F ( 0 ) = 30 歲 ) = 4 5 × { 1 ? [ ( 3 4 ) 2 + ( 1 4 ) 2 ] } + 1 5 × { 1 ? ( 1 1 ) 2 } = 0.3 Gini(A,F^{(0)}=30歲)=\frac{4}{5}\times\lbrace 1-\lbrack (\frac{3}{4})^2+(\frac{1}{4})^2 \rbrack \rbrace+\frac{1}{5}\times\lbrace1-(\frac{1}{1})^2\rbrace=0.3 Gini(A,F(0)=30)=54?×{1?[(43?)2+(41?)2]}+51?×{1?(11?)2}=0.3

五、建立決策樹(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),i0到特征數(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 curInfo0.32,bestInfo0.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.32bestInfocurInfobestInfo0.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
A=是否拖欠貸款

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é)果分析

如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類
*表示了這個(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>如何計(jì)算一個(gè)數(shù)據(jù)集的熵和基尼指數(shù),機(jī)器學(xué)習(xí),決策樹(shù),分類

七,代碼中的語(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • importance中信息增益和基尼系數(shù)

    信息增益和基尼系數(shù)都是用于評(píng)價(jià)決策樹(shù)分裂節(jié)點(diǎn)的指標(biāo),它們有以下主要的相同點(diǎn)和不同點(diǎn): 相同點(diǎn): 都用于測(cè)度數(shù)據(jù)集的無(wú)序程度(impurity),可以評(píng)價(jià)分裂后的無(wú)序程度減少量 取值范圍都在0到1之間,0表示完全有序 都遵循同一思路,優(yōu)先選擇造成無(wú)序程度最大減少的特征進(jìn)行分

    2024年02月10日
    瀏覽(21)
  • 機(jī)器學(xué)習(xí)2:決策樹(shù)--基于信息增益的ID3算法

    機(jī)器學(xué)習(xí)2:決策樹(shù)--基于信息增益的ID3算法

    ? 建立決策樹(shù)的過(guò)程可以分為以下幾個(gè)步驟: 計(jì)算每個(gè)特征的信息增益或信息增益比,選擇最優(yōu)的特征作為當(dāng)前節(jié)點(diǎn)的劃分標(biāo)準(zhǔn)。 根據(jù)選擇的特征將數(shù)據(jù)集劃分為不同的子集。 對(duì)每個(gè)子集遞歸執(zhí)行步驟 1 和步驟 2,直到滿足終止條件。 構(gòu)建決策樹(shù),并輸出。 計(jì)算每個(gè)特征的

    2024年02月06日
    瀏覽(86)
  • 信息增益-決策樹(shù)

    信息增益-決策樹(shù)

    表8.1給出的是帶有標(biāo)記類的元組的訓(xùn)練集D; 類標(biāo)號(hào)屬性 buys_computer有兩個(gè)不同值:{yes, no} 設(shè) 類 C1 → rightarrow → yes,C2 → rightarrow → no; 已知:C1包含9個(gè)元組,C2包含5個(gè)元組; age:{‘youth’, ‘middle_aged’, ‘senior’} youth middle_aged senior yes 2 4 3 no 3 0 2 對(duì)于 y o u t h youth yo u

    2024年03月19日
    瀏覽(27)
  • 數(shù)據(jù)挖掘題目:根據(jù)規(guī)則模板和信息表找出R中的所有強(qiáng)關(guān)聯(lián)規(guī)則,基于信息增益、利用判定樹(shù)進(jìn)行歸納分類,計(jì)算信息熵的代碼

    S∈R,P(S,x )∧ Q(S,y )== Gpa(S,w ) [ s, c ] 其中,P,Q ∈{ Major, Status ,Age }. Major Status Age Gpa Count Arts Graduate Old Good 50 Arts Graduate Old Excellent 150 Arts Undergraduate Young Good 150 Appl_ science Undergraduate Young Excellent Science Undergraduate Young Good 100 解答: 樣本總數(shù)為500,最小支持?jǐn)?shù)為5

    2024年02月06日
    瀏覽(28)
  • 決策樹(shù)的劃分依據(jù)之:信息增益率

    決策樹(shù)的劃分依據(jù)之:信息增益率

    在上面的介紹中,我們有意忽略了\\\"編號(hào)\\\"這一列.若把\\\"編號(hào)\\\"也作為一個(gè)候選劃分屬性,則根據(jù)信息增益公式可計(jì)算出它的信息增益為 0.9182,遠(yuǎn)大于其他候選劃分屬性。 計(jì)算每個(gè)屬性的信息熵過(guò)程中,我們發(fā)現(xiàn),該屬性的值為0, 也就是其信息增益為0.9182. 但是很明顯這么分類,最后

    2024年02月14日
    瀏覽(28)
  • 決策樹(shù)之用信息增益選擇最優(yōu)特征

    決策樹(shù)之用信息增益選擇最優(yōu)特征

    決策樹(shù)之用信息增益選擇最優(yōu)特征 熵 ? 熵的定義: 熵(shāng),熱力學(xué)中表征物質(zhì)狀態(tài)的參量之一,用符號(hào)S表示,其物理意義是體系混亂程度的度量。 在決策樹(shù)中,信息增益是由熵構(gòu)建而成,表示的是[隨機(jī)變量的不確定性],不確定性越大,代表著熵越大。隨機(jī)變量的取值

    2024年02月01日
    瀏覽(19)
  • 信息熵與信息增益在決策樹(shù)生成中的使用

    信息熵與信息增益在決策樹(shù)生成中的使用

    ? ? 決策樹(shù)是機(jī)器學(xué)習(xí)算法的一種,它主要對(duì)給定數(shù)據(jù)集合根據(jù)相關(guān)屬性生成一個(gè)類似樹(shù)結(jié)構(gòu)的一種決策機(jī)制。 ? ? 生成樹(shù)結(jié)構(gòu),其實(shí)可以很隨便,只要根據(jù)特征值的分支做分叉,把所有的特征遍歷完成,這棵樹(shù)就是一顆決策樹(shù)。但是要生成一個(gè)最優(yōu)決策樹(shù),我們需要選擇合

    2024年02月16日
    瀏覽(22)
  • 決策樹(shù)———用基尼系數(shù)建立決策樹(shù)

    決策樹(shù)———用基尼系數(shù)建立決策樹(shù)

    ? ? ? ?第一、什么是決策樹(shù)? ? ? ? ? ? ? ? 簡(jiǎn)單來(lái)說(shuō)就是用于解決分類問(wèn)題的算法。 ? ? ? ?第二、什么是基尼指數(shù)? ? ? ? ? ? ? ? 是用于劃分屬性純度的一個(gè)工具(基尼指數(shù)越小,則純度越高說(shuō)明該屬性越優(yōu)) ? ? ? ? ? ? ?公式如下 對(duì)于各種不同的屬性來(lái)計(jì)它的

    2024年02月10日
    瀏覽(19)
  • 凈重新分類指數(shù)NRI的計(jì)算

    凈重新分類指數(shù)NRI的計(jì)算

    本文首發(fā)于公眾號(hào): 醫(yī)學(xué)和生信筆記 “ 醫(yī)學(xué)和生信筆記 ,專注R語(yǔ)言在臨床醫(yī)學(xué)中的使用,R語(yǔ)言數(shù)據(jù)分析和可視化。主要分享R語(yǔ)言做醫(yī)學(xué)統(tǒng)計(jì)學(xué)、meta分析、網(wǎng)絡(luò)藥理學(xué)、臨床預(yù)測(cè)模型、機(jī)器學(xué)習(xí)、生物信息學(xué)等。 NRI,net reclassification index,凈重新分類指數(shù),是用來(lái)比較模

    2024年02月03日
    瀏覽(19)
  • R語(yǔ)言實(shí)現(xiàn)計(jì)算凈重新分類指數(shù)(NRI)和綜合判別改善指數(shù)(IDI)

    R語(yǔ)言實(shí)現(xiàn)計(jì)算凈重新分類指數(shù)(NRI)和綜合判別改善指數(shù)(IDI)

    兩個(gè)模型比較,與第一個(gè)模型相比,NRI=(重新分對(duì)的 - 重新分錯(cuò)的)/總?cè)藬?shù)。IDI=(新模型患者平均預(yù)測(cè)概率-舊模型患者平均預(yù)測(cè)概率)-(新模型非患者平均預(yù)測(cè)概率-舊模型非患者平均預(yù)測(cè)概率)。NRI=0無(wú)改善,0新模型優(yōu)于舊模型。IDI正值且越大越好。 1、非生存資料:廣

    2024年02月13日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包