专栏 | 基于 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 干貨,我在看?
總結
以上是生活随笔為你收集整理的专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CString LPCTSTR LPTS
- 下一篇: VC+ADO+Access2000数据库