1. 程式人生 > >從零開始-Machine Learning學習筆記(23)

從零開始-Machine Learning學習筆記(23)

0. 前言

  最近的計劃是先將周志華先生的《機器學習》整體先過一遍,對於其中的經典演算法中的一些公式進行推導和理解,並整理成筆記。關於課後習題部分先暫時放一放,留待下個月研究《Machine Learning in Action》的時候,在完成課後習題中關於程式設計的部分。

注:為了方便理解,我將書中的所說的屬性稱為特徵,而可取值數目我稱之為屬性,這樣就比較好理解一些,如特徵為:色澤,他的屬性有{青綠,烏黑,淺白}。

1. 決策樹知識摘要

-ID3 (Iterative Dichotomiser, 迭代二分器)決策樹學習演算法 — 資訊熵,資訊增益
-C4.5決策樹演算法 — 增益率
-CART(Classification and Regression Tree)決策樹演算法

— 基尼指數
-剪枝處理 — 預剪枝, 後剪枝
-連續值與缺失值的處理
-多變數決策樹

2. ID3決策樹學習演算法

ID3演算法包括後面的C4.5演算法都是由澳大利亞電腦科學家羅斯·昆蘭(J. Ross Quinlan)發明。
  在ID3演算法中最為重要的兩個概念就是資訊熵資訊增益。其中資訊熵是資訊理論中的概念,在這裡用於表示資訊的純度。假定當前樣本集合D中第k類樣本所佔比例為pkp_k(k=1,2…|y|),則D的資訊熵可以定義為:
Ent(D)=k=1ypklog2pk Ent(D) = - \sum^{|y|}_{k=1} p_klog_2 p_k

k=1ypklog2pk
資訊增益表示表示屬性a在用於劃分時所獲得“純度提升”的程度,即資訊增益越大,“純度提升”越大,此時就可以選擇資訊增益最大的屬性來進行劃分。資訊增益定義為:
Gain(D,a)=Ent(D)v=1VDvDEnt(Dv) Gain(D,a) = Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
其實ID3演算法的核心就是上述的資訊熵和資訊增益,其具體使用方式可以詳見周志華先生的《機器學習》第75頁。下面我將用簡單的語言來描述資訊熵和資訊增益實際使用的方式(假定訓練集是個二分類問題的訓練集):

(1) 根據訓練集可以求出正負樣本所佔的比例,就是上述的pkp_k,然後可以得到訓練集的資訊熵Ent()

(2) 針對於特徵a(在資料中通常表現為某一列),對應多個屬性{x, y, z}

(3) 計算每個屬性{x, y, z}的資訊熵, 即為資訊增益中的Ent(Dv)Ent(D^v)

(4) 計算每個屬性樣本數佔總樣本數的比例,就是資訊增益中的DvD\frac{|D^v|}{|D|}

(5) 計算每個特徵的資訊增益,選取資訊增益最大的作為最優劃分特徵

NOTE:其實“熵”可以理解為物質的混亂程度。放在機器學習上,如果一個特徵有很多的屬性,如花的顏色有紅色、黃色、綠色等,其屬性越多,越代表這個屬性越混亂,所以其資訊熵也就越高。
  在資訊理論中,我們需要對資訊進行編碼,如果這個資訊比較混亂如花的顏色,每個顏色我們都需要進行編碼,就需要更多位來對這些資訊進編碼,碼字就會比較長。如果只是花的大小,我們用很短的碼字就可以將這兩種屬性區別開來。
  “奧卡姆剃刀”原則告訴我們:如無必要,勿增多餘。其實說的也就是一個“熵”減的行為~
  在資訊增益的公式中,後面表示使用該特徵來進行劃分的時候,整體的“熵”,用原來的“熵”減去使用該特徵來劃分時的“熵”得到的就是這個用這個特徵來劃分的資訊增益,其實就是表示該特徵使原資料集熵下降的程度(或能力),那我當然選擇能力最強的了

3. C4.5決策樹演算法-增益率

由於資訊增益準則對可取值數目較多的屬性有所偏好,為了減少這種偏好所帶來的影響,C4.5演算法不直接使用資訊增益,而採用“增益率”來選擇最優劃分屬性,增益率的定義如下:
Gainratio(D,a)=Gain(D,a)IV(a)IV(a)=v=1VDvDlog2DvD Gain_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} \\ IV(a) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|}log_2 \frac{|D^v|}{|D|}
其實這裡的IV(a)跟資訊熵的定義一樣,只不過資訊熵中的pkp_k是正負樣本所佔的比例,而在IV(a)中,DvD\frac{|D^v|}{|D|}是特徵a中所有屬性對應的樣本個數所佔的比例,IV(a)的值越高就表示特徵a中屬性類別就越多,但是他處於分母上,就勢必會使得增益率減小,就這樣減小了資訊增益“偏好”所帶來的影響。
  需要注意的是,增益率對屬性數目較少的屬性有所偏好,所以C4.5演算法也不是直接選擇增益率最大的特徵,而是採用了一個啟發式的演算法:先從候選特徵中找出資訊增益高於平局水平的特徵;再從這些特徵中選取增益率最高的。

4. CART決策樹-基尼係數

  資料集D的純度可以採用基尼值來度量:
Gini(D)=k=1ykkpkpk=1k=1ypk2 Gini(D)= \sum_{k=1}^{|y|} \sum_{k^{'} \neq k}p_k p_k^{'} \\ = 1 - \sum_{k=1}^{|y|}p_k^{2}
基尼值反應了從資料集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此,基尼值越小,表示D的純度越高。
基尼係數定義為:
Giniindex(D,a)=v=1VDvDGini(Dv) Gini_index(D,a) = \sum_{v=1}^{V} \frac{|D^v|}{|D|} Gini(D^v)
於是在候選集合中,選取基尼係數最小的特徵作為最優劃分特徵。

5. 剪枝

  在決策樹中,剪枝是對付“過擬合”的主要手段。

5.1 預剪枝

  預剪枝是在決策樹的生成過程中,對每個節點子在劃分前先進行估計,如果當前結點的劃分不能帶來決策樹的泛化效能的提升,就停止劃分,並將當前結點標記為葉結點。
  所以這樓裡為了驗證決策樹的泛化效能是否得到提升,**需要將訓練集劃分一部分資料作為驗證集。**於是,我們可以將預剪枝總結為以下的幾個步驟:
(1) 將資料集劃分訓練集和驗證集;
(2) 按照某個規則(以資訊增益最大的特徵作為最優劃分特徵)選取劃分特徵;
(3) 將這個特徵節點標記為葉子節點,且該葉子節點的label為訓練樣例數量最多的label;
(4) 計算此時的決策樹在驗證集上的準確度(劃分前);
(5) 將該節點標記為根節點,其特徵每個屬性對應一個分支,每個分支上的葉子節點標記為該屬性對應的訓練樣本中label數量最多的label;
(5) 計算此時的決策樹在驗證集上的準確度(劃分後);
(6) 判斷劃分前後的準確度,如果劃分後的準確度高於劃分前,則進行劃分;否則就標記為葉子節點,停止劃分。

5.2 後剪枝

後剪枝是先從訓練集生成一顆完整的決策樹,然後自底向上的對非葉節點進行考察,若將該節點替換為葉子節點可以提升決策樹的泛化效能,則將該節點替換為葉子節點,該節點原來的葉子節點就被剪去了。與預剪枝類似,我們可以寫出如下的剪枝步驟:
(1) 將資料集劃分訓練集和驗證集;
(2) 根據訓練集生成一顆決策樹;
(3) 自下而上的考察每一個非葉子節點;
(4) 計算此時的決策樹在驗證集上的準確度(剪枝前);
(5) 將該非葉子節點標記為葉子節點,label標記為此節點中訓練樣例中label數量最多的;
(5) 計算此時的決策樹在驗證集上的準確度(剪枝後);
(6) 判斷剪枝前後的準確度,如果剪枝後的準確度高於剪枝前,則進行進行剪枝;否則就考察下一個非葉子節點。

5.3 預剪枝與後剪枝的比較

預剪枝的優點:可以避免過擬合;減小訓練時間。
預剪枝的缺點:可能帶來欠擬合的風險。

後枝的優點:欠擬合風險小;泛化效能往往優於預剪枝。
後剪枝的缺點:時間開銷大。

6. 連續值與缺失值的處理

6.1 連續值的處理

在處理連續值的時候,我們一般先將這n個連續值由小到大進行排序,並且選取相鄰兩個值的均值Ta作為劃分點,這樣我們可以得到n-1個這樣的劃分點。每個劃分點都將訓練集分成兩個部分,我們將這兩個部分標記為{-, +},那麼我們的資訊增益就可以這麼計算:
Gain(D,a)=maxtTa{Ent(D)λ{+}DλDEnt(Dtλ)} Gain(D, a) = \max_{t ∈ Ta} \{Ent(D) - \sum_{\lambda ∈ \{-,+\}} \frac{|D^ \lambda|}{|D|} Ent({D_t^\lambda})\}
其實就是尋找能使資訊增益最大的劃分點Ta,其中Ent(Dtλ)Ent(D_t^\lambda)就是計算在當前某個點劃分點下的資訊熵,因為劃分點將訓練集分成了兩個部分,每個部分中都有正負樣本,這樣就能計算此時的資訊熵。

值得注意的是,與離散特徵不同,連續特徵還可以作為後代節點的劃分特徵。

6.2 預設值的處理

在訓練集上有時會出現樣本中一些值預設的情況,如果直接丟掉,則是對資訊的極大浪費。在決策樹中,我們同樣可以使用有預設值的樣本進行訓練。
  給定訓練集D和特徵a,

DD^{'}表示在特徵a上沒有預設值的樣本集合。

DvD^{'}_v表示在特徵a中屬性為v的樣本。

DkD^{'}_k表示屬於第k類(如正負樣本)的樣本。

為每一個樣本都定義一個權重wxw_x,**這個權重初始化為1。**於是有如下的幾個引數:
p=xDwxxDwxpk=xDkwxxDwxrv=xDvwxxDwx p = \frac{\sum_{x ∈ D^{'}} w_x}{\sum_{x ∈ D}w_x} \\ p_k = \frac{\sum_{x ∈ D^{'}_k} w_x}{\sum_{x ∈ D^{'}}w_x} \\ r_v = \frac{\sum_{x ∈ D^{'}_v} w_x}{\sum_{x ∈ D^{'}}w_x}