最大信息熵增益_机器学习笔记(三)——搞懂决策树必备的信息增益
一、何為決策樹
決策樹是監(jiān)督學(xué)習(xí)算法之一,并且是一種基本的分類與回歸方法;決策樹也分為回歸樹和分類樹,本文討論的是分類樹。如果了解或者學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu),肯定對(duì)"樹"這個(gè)概念是不陌生的,在此基礎(chǔ)上學(xué)習(xí)掌握決策樹也會(huì)更加容易,下面通過(guò)一個(gè)小例子幫助理解何為決策樹。
下圖所示流程圖即為一個(gè)決策樹,矩形代表判斷模塊、橢圓形則代表終止模塊,表示已經(jīng)得出結(jié)論可以終止程序的運(yùn)行;左右箭頭表示分支,可以通過(guò)它到達(dá)另一判斷模塊或終止模塊。
這個(gè)流程圖主要是假想一個(gè)擇偶系統(tǒng),之前網(wǎng)上不流行這樣一句話嘛,"阿姨我不想努力了",該樹就以是否想繼續(xù)努力為判斷依據(jù),如果你不想繼續(xù)努力了,你可以選擇找一個(gè)"富婆";反之,你想找一個(gè)女朋友一起奮斗,這里又以女孩的性格為判斷依據(jù),如果喜歡性格溫柔的,即選擇"溫柔女孩",若喜歡性格高冷的,則選擇"酷女孩"。
整個(gè)決策樹可以看成一個(gè)if—then規(guī)則,即"如果判斷條件,則……",并且需要注意以下三點(diǎn):
二、決策樹的流程
構(gòu)造決策樹的數(shù)據(jù)必須要充足,特征較少的數(shù)據(jù)集可能會(huì)導(dǎo)致決策樹的正確率偏低。若數(shù)據(jù)特征過(guò)多,不會(huì)選擇特征也會(huì)影響決策樹的正確率。構(gòu)建一個(gè)比較理想的決策樹,大致可分為以下三步:特征選擇、決策樹的生成與決策樹的修剪。
三、特征選擇
特征選擇即決定用數(shù)據(jù)集中哪一個(gè)特征劃分特征空間,主要在于選取對(duì)訓(xùn)練數(shù)據(jù)具有分類能力的特征。這樣做的目的是提高決策樹的效率,如果一個(gè)用特征的分類結(jié)果和隨機(jī)分類的結(jié)果差別不大,那么這個(gè)特征是沒(méi)有什么分類能力的,一般地講這類特征去除對(duì)決策樹的精度影響不大。
下面表格是一份關(guān)于海洋生物的數(shù)據(jù),數(shù)據(jù)的兩個(gè)特征分別為no surfacing(不浮出水面是否能生存)、flippers(是否有腳蹼),一個(gè)類標(biāo)簽fish(是否為魚類)。
no surfacingflippersfish是是是是是是是否否否是否否是否
不論一個(gè)數(shù)據(jù)集有多少特征,每次劃分?jǐn)?shù)據(jù)集時(shí)只能選一個(gè)特征,那么第一次選擇哪個(gè)特征作為劃分的參考屬性才能將數(shù)據(jù)更快的分類呢?答案一定是一定是分類能力最好的那個(gè)特征,但問(wèn)題來(lái)了,如何判斷哪一個(gè)特征分類能力最好呢?這時(shí)就要引入一個(gè)新的概念——信息增益。
什么是信息增益呢?在劃分?jǐn)?shù)據(jù)集之前之后信息發(fā)生的變化成為信息增益,知道如何計(jì)算信息增益,我們就可以計(jì)算每個(gè)特征值劃分?jǐn)?shù)據(jù)集獲得的信息增益,獲得信息增益最高的特征就是最好的選擇。
3.1 熵(香農(nóng)熵)
在計(jì)算信息增益之前,需要先知道"熵"這個(gè)概念,"熵"究竟是什么東西,不必去深究它,我們只需了解熵定義為信息的期望值,在信息論與概率統(tǒng)計(jì)中,熵是表示隨機(jī)變量不確定性的度量,用一句通俗的話講就是這個(gè)體系的混亂程度是如何的。
假設(shè)有一個(gè)樣本為n的數(shù)據(jù)集,第i類樣本為Xi,那么符號(hào)Xi的信息可定義:
其中其中p(Xi)是選擇該分類的概率。通過(guò)改變i的值即可獲得數(shù)據(jù)集中所有類別的信息。
為了計(jì)算熵,我們需要計(jì)算所有類別所有可能值包含的信息期望值(數(shù)學(xué)期望),通過(guò)下面的公式得到:
熵越高,變量的不確定性越大,也就是數(shù)據(jù)的混合程度越高。
3.2計(jì)算熵
在創(chuàng)建數(shù)據(jù)集之前,對(duì)數(shù)據(jù)進(jìn)行一下自定義簡(jiǎn)化,用1代表"是",0代表"否"。 計(jì)算熵代碼如下:
#創(chuàng)建數(shù)據(jù)集def createDataSet(): ? ?DataSet = [[1, 1, 'yes'], ? ? ? ? ? ? ? [1, 1, 'yes'], ? ? ? ? ? ? ? [1, 0, 'no'], ? ? ? ? ? ? ? [0, 1, 'no'], ? ? ? ? ? ? ? [0, 1, 'no']] ? ?#矩陣轉(zhuǎn)化Dataframe ? ?DataSet = pd.DataFrame(DataSet,columns=['no surfacing','flippers','fish']) ? ?return DataSet#計(jì)算信息熵def calculatent(DataSet): ? ?#統(tǒng)計(jì)類標(biāo)簽的分類 ? ?fish_type = DataSet['fish'].value_counts() ? ?''' ? no ? ? 3 yes ? 2 ''' ? ?#獲取樣本個(gè)數(shù) ? ?m = DataSet.shape[0] ? ?#每個(gè)分類的概率,即p(Xi) ? ?p = fish_type/m ? ?#計(jì)算熵值 ? ?ent = (-p*np.log2(p)).sum() ? ?return ent ? ?''' ? 0.9709505944546686 ? '''最后返回熵為0.9709505944546686
這份數(shù)據(jù)中,最后的類標(biāo)簽共有兩類"是魚類"、"不是魚類",前者占總標(biāo)簽個(gè)數(shù)的2/5,后者占3/5。 所以這部分代碼的核心部分即套用求熵公式:
在得到熵之后,就可以按照最大信息增益的方法劃分?jǐn)?shù)據(jù)集,下一部分開始計(jì)算信息增益。
3.3信息增益
計(jì)算過(guò)熵后,怎么計(jì)算信息增益呢?信息增益的計(jì)算就是將父節(jié)點(diǎn)的熵減去其下所有子節(jié)點(diǎn)的熵之和,并且在求和時(shí),由于類別比重不同,需要對(duì)其實(shí)現(xiàn)加權(quán)平均。
以"no surfacing"這一列舉例,5個(gè)樣本中,"1"有3個(gè),"0"有2個(gè),所以二者的權(quán)重一個(gè)為3/5,另一個(gè)為2/5;
其中對(duì)于"1"這三個(gè)樣本,樣本標(biāo)簽fish中的"是"有兩個(gè),"否"有一個(gè),所以分類的概率分別為2/3和1/3,同理對(duì)于"0"這兩個(gè)樣本,樣本標(biāo)簽fish都為"否",所以分類概率為1。
這一列的信息增益計(jì)算公式如下:
兩個(gè)特征的信息增益計(jì)算結(jié)果如下:
計(jì)算每個(gè)特征信息增益的目的就是要選擇出每次分類時(shí)當(dāng)前的最優(yōu)特征,所以一定會(huì)有一個(gè)比較過(guò)程,便于得到最大的信息增益,并且返回該特征的索引,然后就可以利用這個(gè)最優(yōu)特征對(duì)數(shù)據(jù)集進(jìn)行切割。
所以這里構(gòu)造兩個(gè)函數(shù),一個(gè)選擇最優(yōu)特征函數(shù),另一個(gè)是分割數(shù)據(jù)集函數(shù),具體代碼如下:
#最優(yōu)特征函數(shù)def ChooseBF(DataSet): ? ?#獲取基礎(chǔ)信息熵 ? ?all_ent = calculatent(DataSet) ? ?BestGain = 0 #初始化一個(gè)信息增益 ? ?col = -1 #初始化一個(gè)最優(yōu)特征索引 ? ?for i in range(DataSet.shape[1]-1): #遍歷所有特征 ? ? ? ?#獲取第i列的分類 ? ? ? ?index_ = DataSet.iloc[:,i].value_counts().index ? ? ? ?child_ent = 0 #初始化某列的信息熵 ? ? ? ?for j in index_: ? ? ? ? ? ?#將第i列按照類別分類 ? ? ? ? ? ?child_DataSet = DataSet[DataSet.iloc[:,i]==j] ? ? ? ? ? ?#計(jì)算某一類別的信息熵 ? ? ? ? ? ?ent = calculatent(child_DataSet) ? ? ? ? ? ?#將所有類別信息熵加權(quán)求和 ? ? ? ? ? ?child_ent += (child_DataSet.shape[0]/DataSet.shape[0])*ent ? ? ? ?print("第%s列的熵為%s"%(i,child_ent)) ? ? ? ?TheGain = all_ent-child_ent #獲取信息增益 ? ? ? ?print("第%s列的信息增益為%s"%(i,TheGain)) ? ? ? ?#得出最優(yōu)特征索引 ? ? ? ?if(TheGain>BestGain): ? ? ? ? ? ?BestGain = TheGain ? ? ? ? ? ?col = i ? ?print("最優(yōu)特征索引為:%s"%col) ? ?return col這個(gè)函數(shù)兩次調(diào)用計(jì)算信息熵函數(shù)calculatent,一次是為了獲取基礎(chǔ)信息熵,即上面公式中ent('總');另一次則是計(jì)算特征中不同類別的信息熵,即上面公式中ent('是')、ent('否')。 代碼運(yùn)行截圖如下:
返回的最優(yōu)特征索引為0,也就是"no surfacing"這一列;并且兩列的信息增益都與上文手寫計(jì)算的結(jié)果一致,所以代碼是完全沒(méi)有問(wèn)題的。
下一步,利用最優(yōu)特征對(duì)數(shù)據(jù)集進(jìn)行劃分,代碼如下:
#切分?jǐn)?shù)據(jù)集函數(shù)def splitSet(DataSet,col,value): ? ?#找到最優(yōu)特征索引標(biāo)簽 ? ?index = (DataSet.iloc[:,col]).name ? ?#切分?jǐn)?shù)據(jù)集,并把當(dāng)前最優(yōu)特征刪去 ? ?resetdata = DataSet[DataSet.iloc[:,col]==value].drop(index,axis = 1) ? ?return resetdata這個(gè)函數(shù)需要傳入三個(gè)參數(shù),分別是需要切分的數(shù)據(jù)集、最優(yōu)特征索引、特征中需保留的分類,可能有的人還沒(méi)有理解這個(gè)value的作用,對(duì)比一下運(yùn)行結(jié)果就懂了。
? ?''' ? col = 0,value = 1 ? flippers fish 0 ? ? ? ? 1 yes1 ? ? ? ? 1 yes2 ? ? ? ? 0 ? no ? col = 0,value = 0 ? flippers fish3 ? ? ? ? 1 ? no4 ? ? ? ? 1 ? no ? '''上面兩個(gè)DataFrame,是分割數(shù)據(jù)集函數(shù)返回的結(jié)果,當(dāng)value = 1時(shí),保留下來(lái)的這三個(gè)樣本,都是"no surfacing"這一特征中值為1的;而當(dāng)value = 0時(shí),保留下來(lái)的兩個(gè)樣本,就是"no surfacing"這一特征中值為0的,這樣一對(duì)比就很容易理解value的作用了。
文末總結(jié)
至此熵與信息增益的計(jì)算方法大致上已經(jīng)介紹完畢,文中所取數(shù)據(jù)集特征數(shù)很少,所以導(dǎo)致數(shù)據(jù)集分類次數(shù)也會(huì)很少,當(dāng)數(shù)據(jù)特征比較多時(shí),經(jīng)過(guò)第一次劃分之后,數(shù)據(jù)集向下傳遞到?jīng)Q策樹的分支的下一個(gè)結(jié)點(diǎn),在這個(gè)結(jié)點(diǎn)上,我們可以再次劃分?jǐn)?shù)據(jù),因此需要采用遞歸的原則處理數(shù)據(jù)集。
下文將會(huì)介紹如何用遞歸構(gòu)建決策樹以及決策樹的可視化,畢竟決策樹一個(gè)很大的優(yōu)點(diǎn)就是可視化,能夠更好的理解數(shù)據(jù)是如何一步一步劃分的。
私信小編可獲取源碼供參考,感謝閱讀。
總結(jié)
以上是生活随笔為你收集整理的最大信息熵增益_机器学习笔记(三)——搞懂决策树必备的信息增益的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: idea springboot 发布we
- 下一篇: jmeter 线程组与参数_jmeter