1. 決策樹中的特征選擇
分類決策樹是一種描述對實例進行分類的樹型結構,決策樹學習本質上就是從訓練數據集中歸納出一組分類規則,而二叉決策樹類似於if-else規則。決策樹的構建也是非常的簡單,首先依據某種特征選擇手段對每一特征對分類的貢獻性大小排序,然后從根節點開始依次取出剩下特征中對分類貢獻最大的特征,用其作為當前節點的分類准則,進一步構造其葉子結點,然后重復此過程,直到特征用光或滿足了預先設定的要求終止決策樹的構建。由此可見,特征選擇作為決策樹構建的核心技術而存在,那么下面我們就來討論一下決策樹中常用的特征選擇技術有哪些:
1.1 信息增益與信息增益比
一個特征所包含的信息量可以通過看這個特征對整體穩定性的影響大小來確定。舉個例子,
假設我問你:今年冬天會下雪?
你會反問:你說的哪呀?南方和北方會一樣么?你說的話一點信息量都沒有!
我又問:海南,今年冬天會下雪么?
你會說:那肯定不會下呀,氣溫都到不了0下!
從這對話中我們看到,就冬天會不會下雪這個問題開始時會有兩個等可能的判斷,這時候是最讓我們摸不着頭腦的,如果我們接着為其添加一個地域的約束也就是上面的A,此時我們的問題就一下子明朗起來,可見地域信息為我們這個問題的判斷提供了非常大的信息參考。除了地域這個特征,也許還有其他一些信息會影響我們對下雪這個問題的判斷,那么在這個問題我們該如何比較中的各個特征的信息量大小呢?沒錯,就是信息增益。 信息增益衡量的是在得知某一特征A的信息后而使得類Y的不確定性減少的程度,公式如下:
![]()
這里,
表示特征A對類別Y的信息增益,而隨機事件的不確定性可以通過熵來衡量,故
表示類別Y的熵(不確定性),
表示在得知特征A后類別Y的熵。可見信息增益是基於熵提出的!那么問題來了,熵如何衡量事件不確定性的呢?我們首先從公式說起:

用拉格朗日乘子法,我們可以解得當
時,熵是最大的(證明過程參見)。對於一次伯努利實驗的結果其熵的分布滿足:
![]()

可見,在事件最不確定的時候,其熵值最大,也就是說熵是不確定性的單調遞增函數。那么問題又來了,為什么熵的公式是這樣的?具體參考可以參見知乎問答。
有時候信息增益並不能很好的度量兩個特征哪個特征對分類的貢獻大。借用一下李航老師統計學習方法中的貸款申請的例子:

類別有6個“否”、9個“是”,那么數據集D的熵為:
![]()
而對於四種特征它們的信息增益分別是:

到這里看着似乎沒什么問題,那么我們將創造一個問題,把ID也當成一個特征,看看它的信息增益是多少:

到這里我們發現了ID的信息增益最大呀!那ID就是最好的特征么?開玩笑吧!總的來說,信息增益傾向於選擇特征取值多的特征,和上面的例子一樣,把ID當作最好的特征,是不是很傻。所以為了克服它的這種缺陷,信息增益比就誕生了。信息增益比相當於對每個特征的信息增益加了一個權值,抵消了特征取值數對信息增益的影響,這樣就把信息增益歸一到同一量級,更加方便比較它們的大小。
特征A對於訓練數據集D的信息增益比定義為:
,其中n為特征A的取值個數。
1.2 基尼系數
CART分類樹中會用到基尼指數作為樣本不確定性的度量,同熵代表的含義相同:基尼系數越大,代表了隨機變量越不確定,也就是隨機變量越隨機。分類問題中,假設有K個類,樣本屬於第k類的概率為
,那么該概率分布的基尼指數為

CART構造的是一顆二叉分類樹,那么一般我們將一特征集切分成兩部分,故得到在特征A給定的條件下,集合D的基尼指數定義為
![]()
2. Sklearn中的特征選擇
特征選擇並不只是用於決策樹的構建,特征選擇也是機器學習中經常用到的一門技術。特征選擇技術出現的原因是:我們要知道在一個機器學習任務中,並不是我們獲取的所有特征都對模型構建有着積極的影響,即使都有積極的效益,我們可能也要權衡特征項數與建模效率之間的關系。而特征選擇可以非常有效的解決這些問題。特征選擇技術可以幫助我們篩選出對建模最有用的特征,把可有可無的特征項去除,不僅可以加速我們模型的訓練,還可以有效清除噪聲特征對模型的影響。下面將簡單過一下sklearn中特征選擇,然后選一些自己曾經見過的技術,研究一下它的用法:


2.1 基於卡方統計量的特征選擇
what is 卡方檢驗統計量:卡方統計量是用於檢驗實際分布與理論分布配合程度,也可以說成統計樣本的實際觀測值與理論推斷值之間的偏差程度的統計量。若卡方值越大,說明偏差越大,越不符合實際;而卡方值越小,說明偏差越小,越是符合實際情況;若卡方值為0,說明理論完全符合實際!下面是卡方統計量的公式:
![]()
其中,
表示實際觀測次數,
表示理論觀測次數。因為卡方檢驗可以用於檢測隨機變量之間的依賴關系,因此我們可以用它來清除那些最有可能與類別不想關的特征,來減少噪音特征對分類的影響。
sklearn.feature_selection.chi2(X, y) """ 參數 --- X: 特征矩陣 (n_samples * n_features_in 維) y: 標簽向量 (n_samples * 1 維) 返回值 --- chi2:每個特征的卡方統計量(n_features * 1 維) pval :每個特征的p-value (n_features * 1 維) 算法時間復雜度O(n_samples * n_features_in) """
2.2 基於方差分析的特征選擇
方差是描述隨機變量離散程度的統計量,其公式為:

而分差分析基本思想認為不同特征對分類模型的貢獻程度之所以不同,主要源自於各個特征在組內與組間離散程度存在差異,於是F-score就出現了:

sklearn.feature_selection.f_classif(X, y) """ 參數 --- X: 特征矩陣 (n_samples * n_features_in 維) y: 標簽向量 (n_samples * 1 維) 返回值 --- F:每個特征的卡方統計量(n_features * 1 維) pval :每個特征的p-value (n_features * 1 維) 算法時間復雜度O(n_samples * n_features_in) """
