一:基礎知識
1:個體信息量
-long2pi
2:平均信息量(熵)
Info(D)=-Σi=1...n(pilog2pi)
比如我們將一個立方體A拋向空中,記落地時着地的面為f1,f1的取值為{1,2,3,4,5,6},f1的熵entropy(f1)=-(1/6*log(1/6)+...+1/6*log(1/6))=-1*log(1/6)=2.58
3:假設我們選擇屬性R作為分裂屬性,數據集D中,R有k個不同的取值{V1,V2,...,Vk},於是可將D根據R的值分成k組{D1,D2,...,Dk},按R進行分裂后,將數據集D不同的類分開還需要的信息量為:
InfoR(D)=Σi=1...k(Di/D)Info(Di)
4:信息增益:分裂前后,兩個信息量只差:
Gain(R)=Info(D)-InfoR(D)
5:增益比率
信息增益選擇方法有一個很大的缺陷,它總是會傾向於選擇屬性值多的屬性,如果我們在上面的數據記錄中加一個姓名屬性,假設14條記錄中的每個人姓名不同,那么信息增益就會選擇姓名作為最佳屬性,因為按姓名分裂后,每個組只包含一條記錄,而每個記錄只屬於一類(要么購買電腦要么不購買,信息量計算為1/14(-1/1log1/1-0/1log0/1)*14=0,信息增益最大),因此純度最高,以姓名作為測試分裂的結點下面有14個分支。但是這樣的分類沒有意義,它沒有任何泛化能力。增益比率對此進行了改進,它引入一個分裂信息:
SplitInfoR(D)=-Σi=1...n(Di/D)log2(Di/D)
增益比率定義為信息增益與分裂信息的比率:
GainRatio(R)=Gain(R)/SplitInfoR(D)
我們找GainRatio最大的屬性作為最佳分裂屬性。如果一個屬性的取值很多,那么SplitInfoR(D)會大,從而使GainRatio(R)變小。
不過增益比率也有缺點,SplitInfo(D)可能取0,此時沒有計算意義;且當SplitInfo(D)趨向於0時,GainRatio(R)的值變得不可信,改進的措施就是在分母加一個平滑,這里加一個所有分裂信息的平均值:
GainRatio(R)=Gain(R)/(SplitInfo(D)+SplitInfoR(D))
二:例子
記錄ID | 年齡 | 收入層次 | 學生 | 信用等級 | 是否購買電腦 |
1 | 青少年 | 高 | 否 | 一般 | 否 |
2 | 青少年 | 高 | 否 | 良好 | 否 |
3 | 中年 | 高 | 否 | 一般 | 是 |
4 | 老年 | 中 | 否 | 一般 | 是 |
5 | 老年 | 低 | 是 | 一般 | 是 |
6 | 老年 | 低 | 是 | 良好 | 否 |
7 | 中年 | 低 | 是 | 良好 | 是 |
8 | 青少年 | 中 | 否 | 一般 | 否 |
9 | 青少年 | 低 | 是 | 一般 | 是 |
10 | 老年 | 中 | 是 | 一般 | 是 |
11 | 青少年 | 中 | 是 | 良好 | 是 |
12 | 中年 | 中 | 否 | 良好 | 是 |
13 | 中年 | 高 | 是 | 一般 | 是 |
14 | 老年 | 中 | 否 | 良好 | 否 |
1:計算Info(D)
Info(D)=-Σi=1...n(pilogpi)=-(5/14)log(5/14)-(9/14)log(9/14)=-0.3571*(-1.4856)-0.6429*(-0.6373)=0.1597+0.1234=0.5305+0.4097=0.9402
2:計算InfoR(D)
Info年齡(D)=(5/14)Info(D老年)+(4/14)Info(D中年)+(5/14)Info(D青少年)=(5/14)(-(3/5)log(3/5)-(2/5)log(2/5))+(4/14)(-(4/4)log(4/4)-(0/4)log(0/4))+(5/14)(-(2/5)log(2/5)-(3/5)log(3/5))
=(5/14)(0.6*0.737+0.4*1.3219)+(4/14)(0+0)+(5/14)(0.4*1.3219+0.6*0.737)
=(5/14)(0.4422+0.52876)+0+(5/14)(0.52876+0.4422)
=0.3571*0.97096+0+0.3571*0.97096
=0.694
同樣可以計算出
Info收入層次(D)=0.911
Info學生(D)=0.789
Info信用等級(D)=0.892
3:計算信息增益:
Gain(年齡)=Info(D)-Info年齡(D)=0.940-0.694=0.246
Gain(收入層次)=Info(D)-Info收入層次(D)=0.940-0.911=0.029
Gain(學生)=Info(D)-Info學生(D)=0.940-0.789=0.151
Gain(信用等級)=Info(D)-Info信用等級(D)=0.940-0.892=0.058
4:計算分裂信息:
SplitInfo年齡(D)=-5/14log(5/14)-4/14log(4/14)-5/14log(5/14)=0.3571*1.4856+0.2857*1.8074+0.3571*1.4856=0.5305+0.5164+0.5305=1.5774
SplitInfo收入層次(D)=-4/14log(4/14)-6/14log(6/14)-4/14log(4/14)=0.2857*1.8074+0.4286*1.2223+0.2857*1.8074=0.5164+0.5139+0.5164=1.5467
SplitInfo學生(D)=-7/14log7/14-7/14log7/14=1
SplitInfo信用等級(D)=-6/14log(6/14)-8/14log(8/14)=0.4286*1.2223+0.5714*0.8074=0.5239+0.4613=0.9852
SplitInfo(D)=(SplitInfo年齡(D)+SplitInfo收入層次(D)+SplitInfo學生(D)+SplitInfo信用等級(D))/4=1.2773
5:計算增益比率:
GainRatio(年齡)=Gain(年齡)/(SplitInfo(D)+SplitInfo年齡(D))=0.246/(1.2773+1.5774)=0.0862
GainRatio(收入層次)=Gain(收入層次)/(SplitInfo(D)+SplitInfo收入層次(D))=0.029/(1.2773+1.5467)=0.0103
GainRatio(學生)=Gain(學生)/(SplitInfo(D)+SplitInfo學生(D))=0.151/(1.2773+1)=0.0663
GainRatio(信用等級)=Gain(信用等級)/(SplitInfo(D)+SplitInfo信用等級(D))=0.058/(1.2773+0.9852)=0.0256