1. 程式人生 > >【機器學習】特徵選擇之最小冗餘最大相關性(mRMR)與隨機森林(RF)

【機器學習】特徵選擇之最小冗餘最大相關性(mRMR)與隨機森林(RF)

特徵選擇之最小冗餘最大相關性(mRMR)

最小冗餘最大相關性(mRMR)是一種濾波式的特徵選擇方法,由Peng et.al提出。主要用途有機器學習,影象識別等。


一種常用的特徵選擇方法是最大化特徵與分類變數之間的相關度,就是選擇與分類變數擁有最高相關度的前k個變數。但是,在特徵選擇中,單個好的特徵的組合並不能增加分類器的效能,因為有可能特徵之間是高度相關的,這就導致了特徵變數的冗餘。這就是Peng et.al說的“the m best features are not the best m features”。因此最終有了mRMR,即最大化特徵與分類變數之間的相關性,而最小化特徵與特徵之間的相關性

。這就是mRMR的核心思想。

最大相關最小冗餘(mRMR),顧名思義,它不僅考慮到了特徵和label之間的相關性,還考慮到了特徵和特徵之間的相關性。度量標準使用的是互資訊(Mutual information)對於mRMR方法,特徵子集與類別的相關性通過各個特徵與類別的資訊增益的均值來計算,而特徵與特徵的冗餘使用的是特徵和特徵之間的互資訊加和再除以子集中特徵個數的平方,因為I(xi,xj)計算了兩次。

互資訊:給定兩個隨機變數x和y,它們的概率密度函式(對應於連續變數)為p(x),p(y),p(x,y)。則互資訊為

I(x;y)=\int \int p(x,y)log\frac{p(x,y)}{p(x)p(y)}dxdy

mRMR演算法:找出含有m\left \{ x_i \right \}個特徵的特徵子集S

1.離散變數

(1)最大相關性

maxD(S,c),D=\frac{1}{|S|}\sum_{x_i \epsilon S}{I(x_i;c)}

x_i

為第i個特徵,c為類別變數,S為特徵子集

(2)最小冗餘度

minR(S),R=\frac{1}{|S|^2}\sum_{x_i,x_j\epsilon S}{I(x_i;x_j)}

2.連續變數

(1)最大相關性

maxD_F ,D_F=\frac{1}{|S|}\sum_{x_i\epsilon S}{F(x_i;c)}

F(x_i,c)為F統計量

(2)最小冗餘度

minR_c,R=\frac{1}{|S|^2}\sum_{x_i,x_j\epsilon S}{c(x_i;x_j)}

c(x_i;x_j)為相關函式

對於這些目標函式,還可以換成其他的函式,如資訊增益、基尼係數等,然後整合最大相關性和最小冗餘度:

加法整合:

max\phi (D,R),\phi =D-R

乘法整合:

max\phi (D,R),\phi =D/R

在實踐中,用增量搜尋方法尋找近似最優的特徵。假設已有特徵集S_{m-1},任務就是從剩下的特徵X-S_{m-1}中找到第m個特徵,通過選擇特徵使得\phi (\cdot )最大。增量演算法優化下面的條件:

max_{x_j\epsilon X-S_{m-1}}[I(x_j;c)-\frac{1}{m-1}\sum_{x_i \epsilon S_{m-1}}{I(x_j;x_i)}]

其演算法複雜度為O(|S|\cdot M)

mRMR演算法的實現,參考github連結:https://github.com/csuldw/MachineLearning/tree/master/mRMR

演算法的優點:

  • 速度快
  • 估計結果有較好的魯棒性
  • I(\cdot )的一階最優估計

使用mRMR進行特徵選擇後,會得到一個重要性排名。接下來通常需要結合交叉驗證來選擇結果效能最好的特徵子集。比較原始的方法就是,根據排名對特徵子集從top1-topn一個個進行交叉驗證測試,然後選擇結果最好的一組特徵即可。

參考資料:

  1. Feature Selection Based on Mutual Information: Criteria of Max-Dependency, Max-Relevance, and Min-Redundancy
  2. Feature Selection for High-Dimensional Data

特徵選擇之隨機森林(RF)

Random Forest :隨機森林,使用的CART演算法的方法增長樹,也就是使用Gini指數來劃分。Gini指數度量的是資料分割槽或訓練集D的不純度(注意,這裡是不純度,跟熵有點不同)。基尼不純度表示的是一個隨機選中的樣本在子集中被分錯的可能性。基尼不純度為這個樣本被選中的概率乘上它被分錯的概率。當一個節點中所有樣本都是一個類時,基尼不純度為零。 定義為:

Gini(D)=1-\sum_{i=1}^{m}{p_{i}^{2}}

當考慮二元劃分裂時,計算每個結果分割槽的不純度加權和。比如A有兩個值,則特徵D被劃分成D1和D2,這時Gini指數為:

Gini_A{D}=\frac{D_1}{D}Gini(D_1)+\frac{D_2}{D}Gini(D_2)

Gini指數偏向於多值屬性,並且當類的數量很大時會有困難,而且它還傾向於導致相等大小的分割槽和純度。但實踐效果不錯。

互資訊:是條件概率後驗概率的比值,化簡之後就可以得到資訊增益。所以說互資訊其實就是資訊增益。計算方法【互資訊=熵-條件熵】。熵描述的是不確定性熵越大,不確定性就越大條件熵H(B|A)描述的是在A給定的條件下B的不確定性,如果條件熵越小,表示不確定性就越小,那麼B就越容易確定結果。所以使用熵減去條件熵,就得到了資訊增益,它描述的不確定性的降低程度,可以用來度量兩個變數的相關性。比如,在給定一個變數的條件下,另一個變數它的不確定性能夠降低多少,如果不確定性降低得越多,那麼它的確定性就越大,就越容易區分,兩者就越相關

隨機森林對於每一棵決策樹,首先對列(特徵)進行取樣,然後計算當前的Gini指數,隨後進行全分裂過程,每棵樹的非葉節點都有一個Gini指數,一棵樹建立之後可以得到該樹各個節點的重要性,通過對其按照Gini指數作為特徵相關性來排序,接著一次建立多棵決策樹,並且生成多個特徵相關性排名,最後對這些特徵選平均值,得到最終排好序的特徵重要性排名

隨機森林OOB特徵選擇:

  1. 首先建立m棵決策樹,然後分別計算每棵樹的OOB袋外誤差errOOBj。
  2. 計算特徵的重要性。隨機的修改OOB中的每個特徵的值,再次計算它的袋外誤差errOOBi;
  3. 按照特徵的重要性排序,然後剔除後面不重要的特徵;
  4. 然後重複以上步驟,直到選出m個特徵。

在scikit-learn中封裝了random forest特徵選擇方法:

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 13 11:35:01 2018

@author: PANG
"""

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np

# load boston housing dataset as an example
boston = load_boston()
X=boston['data']
Y=boston['target']
names=boston['feature_names']
rf = RandomForestRegressor()
rf.fit(X,Y)
print("Features sorted by their score:")
print(sorted(zip(map(lambda x:round(x,4),rf.feature_importances_),names),reverse=True))

最後輸出的是: