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