專欄 | 基於 Jupyter 的特徵工程手冊:特徵選擇(三)

作者:陳穎祥、楊子晗

編譯:AI有道

數據預處理後,我們生成了大量的新變量(比如獨熱編碼生成了大量僅包含0或1的變量)。但實際上,部分新生成的變量可能是多餘:一方面它們本身不一定包含有用的信息,故無法提高模型性能;另一方面過這些多餘變量在構建模型時會消耗大量內存和計算能力。因此,我們應該進行特徵選擇並選擇特徵子集進行建模。

項目地址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook

本文將介紹特徵工程中的 Multivariate Filter Methods 多元特徵過濾。

目錄:

1.1.2 Multivariate Filter Methods 多元特徵過濾

單變量特徵過濾僅考慮了每一變量與目標變量之間的關係,而忽視了變量間的相關性。多元變量過濾則解決了這一問題,其考慮了變量之間的相互關係,基於整個特徵空間選擇最佳特徵。因此多元特徵過濾在刪除冗餘變量方面表現更好。這裏利用亞利桑那州立大學開發的skfeature模塊來進行多元特徵過濾。

1.1.2.1 Max-Relevance Min-Redundancy (mRMR) 最大相關最小冗餘

最大相關最小冗餘試圖尋找一個與目標變量有較高相關性(例如:MI)的變量子集,同時這個子集中的變量還應具有較低的相互關聯性。通過解析源代碼,我們發現,skfeature中最大相關最小冗餘方法僅適用於分類問題中的離散特徵,因爲它計算過程中使用的是計算離散情形下的互信息 (MI)的公式。 

公式: 

假設數據集共包含m個特徵,則基於mRMR公式,其中第n個特徵的重要性可被表示爲:

????(????,????????) 爲變量????????與目標變量Y的互信息。1/|????|∑????????∈????????(????????,????????)爲變量????????與現有變量子集中所有變量的互信息的平均值。 

mRMR其實是一個逐步(step-wise)的方法,在mRMR特徵選擇過程的每一步中,具有最高特徵重要性????????????????????(????????)的變量????????,(????????∉????)將會被加入子集中,直至子集中的變量數達到用戶要求。

import numpy as np
from skfeature.function.information_theoretical_based import MRMR
from sklearn.datasets import load_iris  # 利用iris數據作爲演示數據集


# 載入數據集
iris = load_iris()
X, y = iris.data, iris.target


# 選擇前100個觀測點作爲訓練集
# 剩下的50個觀測點作爲測試集
# 由於skfeature中的mRMR僅適用於離散變量
# 因此我們通過將float轉換爲int而把所有連續變量轉換爲離散變量
# 此轉換僅用於演示目的


train_set = X[0:100,:].astype(int)
test_set = X[100:,].astype(int)
train_y = y[0:100].astype(int)


feature_index,_,_ = MRMR.mrmr(train_set, train_y, n_selected_features=2) # 在訓練集上訓練
transformed_train = train_set[:,feature_index] # 轉換訓練集
assert np.array_equal(transformed_train, train_set[:,[2,3]])  # 其選擇了第三個及第四個變量


transformed_test = test_set[:,feature_index] # 轉換測試集
assert np.array_equal(transformed_test, test_set[:,[2,3]]) # 其選擇了第三個及第四個變量

1.1.2.2 Correlation-based Feature Selection (CFS) 基於相關性的特徵選擇

與mRMR類似,基於相關性的特徵選擇(CFS)也基於一個類似的假設:一個好的特徵子集應包含與目標高度相關且彼此不相關的特徵。通過解析源代碼,我們發現,skfeature中CFS的實現也僅適用於分類問題中的離散特徵。因爲其使用的是離散情形下的對稱不確定性(symmetrical uncertainty)作爲變量間相關性的衡量標準。 

公式:

???? 爲特徵子集. 我們需要尋找最大化????????????????????????的最優子集????∗。 

????????(????????,????)爲離散變量????????與目標變量????間的對稱不確定性(SU)。 

????????(????????,????????)爲離散變量????????與離散變量????????間的對稱不確定性(SU)。

import numpy as np
from skfeature.function.statistical_based import CFS
from sklearn.datasets import load_iris  # 利用iris數據作爲演示數據集


# 載入數據集
iris = load_iris()
X, y = iris.data, iris.target


# 選擇前100個觀測點作爲訓練集
# 剩下的50個觀測點作爲測試集
# 由於skfeature中的CFS僅適用於離散變量
# 因此我們通過將float轉換爲int而把所有連續變量轉換爲離散變量
# 此轉換僅用於演示目的


train_set = X[0:100,:].astype(int)
test_set = X[100:,].astype(int)
train_y = y[0:100].astype(int)


num_feature = 2 # 從原數據集中選擇兩個變量


feature_index = CFS.cfs(train_set, train_y) # 在訓練集上訓練
transformed_train = train_set[:,feature_index[0:num_feature]] # 轉換訓練集
assert np.array_equal(transformed_train, train_set[:,[3,2]])  # 其選擇了第三個及第四個變量


transformed_test = test_set[:,feature_index[0:num_feature]] # 轉換測試集
assert np.array_equal(transformed_test, test_set[:,[3,2]]) # 其選擇了第三個及第四個變量

1.1.2.3 Fast Correlation-based Filter (FCBF) 基於相關性的快速特徵選擇

相比於CFS,FCBS能夠更加高效的篩選變量。其同樣爲逐步(step-wise)的方法,具體步驟與mRMR非常類似,但FCBS使用對稱不確定性(SU)衡量變量間的關聯性。FCBF首先剔除與目標變量具有較低SU值的變量,並對剩下的變量按與目標變量的SU值從最高到最低排序,然後逐一刪除冗餘特徵。與mRMR,CFS相似,在skfeature中實現的FCBF僅適用於具有離散變量的分類問題。

公式:

步驟: 

1)計算每個特徵變量 ???????? 與目標變量 ???? 之間的相關性 ????????(????????,????) 

2)僅保留 ????????(????????,????) 大於一定閾值 ???? 的特徵變量,組成候選列表 ???????????????????? 

3)按照 ????????(????????,????) 值的大小對 ???????????????????? 中的變量從大到小排序 

4)按順序依次計算每一個特徵 ???????? 與候選列表 ???????????????????? 中順序靠後的每一個特徵 ???????? 的相關SU值 ????????(????????,????????) 

5)若 ????????(????????,????????) 大於 ????????(????????,????) ,則從候選列表 ???????????????????? 中刪除 ????????

import numpy as np
from skfeature.function.information_theoretical_based import FCBF
from sklearn.datasets import load_iris  # 利用iris數據作爲演示數據集


# 載入數據集
iris = load_iris()
X, y = iris.data, iris.target


# 選擇前100個觀測點作爲訓練集
# 剩下的50個觀測點作爲測試集
# 由於skfeature中的FCFS僅適用於離散變量
# 因此我們通過將float轉換爲int而把所有連續變量轉換爲離散變量
# 此轉換僅用於演示目的


train_set = X[0:100,:].astype(int)
test_set = X[100:,].astype(int)
train_y = y[0:100].astype(int)


num_feature = 2 # 從原數據集中選擇兩個變量


feature_index = FCBF.fcbf(train_set, train_y, n_selected_features = num_feature)[0] # 在訓練集上訓練
transformed_train = train_set[:,feature_index[0:num_feature]] # 轉換訓練集
assert np.array_equal(transformed_train, train_set[:,[3]])  # 其僅選擇了第四個變量 
# 這是由於其他變量目標變量????之間的相關性過低造成的


transformed_test = test_set[:,feature_index[0:num_feature]] # 轉換測試集
assert np.array_equal(transformed_test, test_set[:,[3]]) # 其僅選擇了第四個變量

1.1.2.4 ReliefF

ReliefF方法是一種基於Relief方法的特徵加權算法。在Relief方法中,其根據特徵與目標變量的相關性強弱(二分類)給變量分配權重,並刪除權重低於特定閾值的特徵。其將相關性定義爲變量區分鄰近觀測點的能力。

具體來說,在每一步中,Relief方法都會從訓練集中隨機選擇一個觀測點S,然後找到具有相同目標標籤的S的最近鄰觀測點,稱爲NearHit。它還將找到具有不同目標標籤的S的最近鄰觀測點,稱爲NearMiss。然後根據以下規則更新每個功能的權重:

1)若觀測點S在某變量上與NearHit的距離大於與NearMiss的距離,則該變量的權重將增加,因爲變量有助於區分最鄰近情形下的目標標籤。2)相反,若觀測點S在某變量上與NearHit的距離小於與NearMiss的距離,則該變量的權重會降低。

將上述過程重複m次,最後我們會獲得每個特徵變量的平均權重。特徵變量的權重越大,則特徵的分類能力越強,越應該被留在最終的特徵子集中。

在ReliefF中,其修改了權重更新的方式,因此ReliefF方法可以被應用於多類分類問題。另外,它隨機採樣K個最近的觀測點而不是一個。

在skfeature中實現的ReliefF可用於分類問題中的連續特徵或二元類別特徵,因其使用的是L1範數來衡量差異。針對非二元特徵,我們可以先將其獨熱編碼,再使用ReliefF方法。

公式:

????1 and ????2 爲任意兩個觀測點。????????爲某一特徵變量. S爲我們選擇的觀測點. ????????爲第j個NearHit,????????爲第j個NearMiss. C爲與我們所選的觀測點不同的其他目標類別標籤。

import numpy as np
from skfeature.function.similarity_based import reliefF
from sklearn.datasets import load_iris  # 利用iris數據作爲演示數據集


# 載入數據集
iris = load_iris()
X, y = iris.data, iris.target


# 選擇前100個觀測點作爲訓練集
# 剩下的50個觀測點作爲測試集
# skfeature中的reliefF直接適用於連續變量


train_set = X[0:100,:]
test_set = X[100:,]
train_y = y[0:100]


num_feature = 2 # 從原數據集中選擇兩個變量


score = reliefF.reliefF(train_set, train_y) # 計算每一個變量的權重
feature_index = reliefF.feature_ranking(score) # 依據權重選擇變量
transformed_train = train_set[:,feature_index[0:num_feature]] # 轉換訓練集
assert np.array_equal(transformed_train, train_set[:,[2, 3]])  # 其選擇了第三個及第四個變量


transformed_test = test_set[:,feature_index[0:num_feature]] # 轉換測試集
assert np.array_equal(transformed_test, test_set[:,[2, 3]]) # 其選擇了第三個及第四個變量

1.1.2.5 Spectral Feature Selection (SPEC) 基於譜圖的特徵選擇

基於譜圖的特徵選擇(SPEC)方法是基於譜圖理論的無監督方法。其首先建立變量相似度集合S,並建立其圖表示。然後,其根據構造圖的頻譜評估特徵。由於在skfeature中實現的SPEC方基於RBF(高斯)內核建立相似集,因此其可用於分類問題中的連續特徵或二元類別特徵。針對非二元特徵,我們可以先將其獨熱編碼,再使用ReliefF方法。

import numpy as np
from skfeature.function.similarity_based import SPEC
from sklearn.datasets import load_iris  # 利用iris數據作爲演示數據集


# 載入數據集
iris = load_iris()
X, y = iris.data, iris.target


# 選擇前100個觀測點作爲訓練集
# 剩下的50個觀測點作爲測試集
# skfeature中的SEPC方法直接適用於連續變量


train_set = X[0:100,:]
test_set = X[100:,]
train_y = y[0:100]


num_feature = 2 # 從原數據集中選擇兩個變量


score = SPEC.spec(train_set) # 計算每一個變量的得分
feature_index = SPEC.feature_ranking(score) #依據變量得分選擇變量
transformed_train = train_set[:,feature_index[0:num_feature]] # 轉換訓練集
assert np.array_equal(transformed_train, train_set[:,[1, 0]])  # 其選擇了第一個及第二個變量


transformed_test = test_set[:,feature_index[0:num_feature]] # 轉換測試集
assert np.array_equal(transformed_test, test_set[:,[1, 0]]) # 其選擇了第一個及第二個變量

專欄系列:

專欄 | 基於 Jupyter 的特徵工程手冊:數據預處理(一)

專欄 | 基於 Jupyter 的特徵工程手冊:數據預處理(二)

專欄 | 基於 Jupyter 的特徵工程手冊:數據預處理(三)

專欄 | 基於 Jupyter 的特徵工程手冊:數據預處理(四)

專欄 | 基於 Jupyter 的特徵工程手冊:特徵選擇(一)

專欄 | 基於Jupyter 的特徵工程手冊:特徵選擇(二)

目前該項目完整中文版正在製作中,請持續關注哦~

中文版 Jupyter 地址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/中文版/2.%20特徵選擇.ipynb


推薦閱讀

(點擊標題可跳轉閱讀)

乾貨 | 公衆號歷史文章精選

我的深度學習入門路線

我的機器學習入門路線圖

算法工程師必備

AI有道年度技術文章電子版PDF來啦!

掃描下方二維碼,添加 AI有道小助手微信,可申請入羣,並獲得2020完整技術文章合集PDF(一定要備註:入羣 + 地點 + 學校/公司。例如:入羣+上海+復旦。 

長按掃碼,申請入羣

(添加人數較多,請耐心等待)

 

最新 AI 乾貨,我在看 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章