专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)
作者:陳穎祥、楊子晗
編譯:AI有道
數(shù)據(jù)預處理后,我們生成了大量的新變量(比如獨熱編碼生成了大量僅包含0或1的變量)。但實際上,部分新生成的變量可能是多余:一方面它們本身不一定包含有用的信息,故無法提高模型性能;另一方面過這些多余變量在構(gòu)建模型時會消耗大量內(nèi)存和計算能力。因此,我們應(yīng)該進行特征選擇并選擇特征子集進行建模。
項目地址:
https://github.com/YC-Coder-Chen/feature-engineering-handbook
本文將介紹特征工程中的 Multivariate Filter Methods 多元特征過濾。
目錄:
1.1.2 Multivariate Filter Methods 多元特征過濾
單變量特征過濾僅考慮了每一變量與目標變量之間的關(guān)系,而忽視了變量間的相關(guān)性。多元變量過濾則解決了這一問題,其考慮了變量之間的相互關(guān)系,基于整個特征空間選擇最佳特征。因此多元特征過濾在刪除冗余變量方面表現(xiàn)更好。這里利用亞利桑那州立大學開發(fā)的skfeature模塊來進行多元特征過濾。
1.1.2.1?Max-Relevance Min-Redundancy (mRMR) 最大相關(guān)最小冗余
最大相關(guān)最小冗余試圖尋找一個與目標變量有較高相關(guān)性(例如:MI)的變量子集,同時這個子集中的變量還應(yīng)具有較低的相互關(guān)聯(lián)性。通過解析源代碼,我們發(fā)現(xiàn),skfeature中最大相關(guān)最小冗余方法僅適用于分類問題中的離散特征,因為它計算過程中使用的是計算離散情形下的互信息 (MI)的公式。?
公式:?
假設(shè)數(shù)據(jù)集共包含m個特征,則基于mRMR公式,其中第n個特征的重要性可被表示為:
????(????,????????) 為變量????????與目標變量Y的互信息。1/|????|∑????????∈????????(????????,????????)為變量????????與現(xiàn)有變量子集中所有變量的互信息的平均值。?
mRMR其實是一個逐步(step-wise)的方法,在mRMR特征選擇過程的每一步中,具有最高特征重要性????????????????????(????????)的變量????????,(?????????????)將會被加入子集中,直至子集中的變量數(shù)達到用戶要求。
import numpy as np from skfeature.function.information_theoretical_based import MRMR from sklearn.datasets import load_iris # 利用iris數(shù)據(jù)作為演示數(shù)據(jù)集# 載入數(shù)據(jù)集 iris = load_iris() X, y = iris.data, iris.target# 選擇前100個觀測點作為訓練集 # 剩下的50個觀測點作為測試集 # 由于skfeature中的mRMR僅適用于離散變量 # 因此我們通過將float轉(zhuǎn)換為int而把所有連續(xù)變量轉(zhuǎn)換為離散變量 # 此轉(zhuǎn)換僅用于演示目的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] # 轉(zhuǎn)換訓練集 assert np.array_equal(transformed_train, train_set[:,[2,3]]) # 其選擇了第三個及第四個變量transformed_test = test_set[:,feature_index] # 轉(zhuǎn)換測試集 assert np.array_equal(transformed_test, test_set[:,[2,3]]) # 其選擇了第三個及第四個變量1.1.2.2 Correlation-based Feature Selection (CFS) 基于相關(guān)性的特征選擇
與mRMR類似,基于相關(guān)性的特征選擇(CFS)也基于一個類似的假設(shè):一個好的特征子集應(yīng)包含與目標高度相關(guān)且彼此不相關(guān)的特征。通過解析源代碼,我們發(fā)現(xiàn),skfeature中CFS的實現(xiàn)也僅適用于分類問題中的離散特征。因為其使用的是離散情形下的對稱不確定性(symmetrical uncertainty)作為變量間相關(guān)性的衡量標準。?
公式:
???? 為特征子集. 我們需要尋找最大化????????????????????????的最優(yōu)子集?????。?
????????(????????,????)為離散變量????????與目標變量????間的對稱不確定性(SU)。?
????????(????????,????????)為離散變量????????與離散變量????????間的對稱不確定性(SU)。
import numpy as np from skfeature.function.statistical_based import CFS from sklearn.datasets import load_iris # 利用iris數(shù)據(jù)作為演示數(shù)據(jù)集# 載入數(shù)據(jù)集 iris = load_iris() X, y = iris.data, iris.target# 選擇前100個觀測點作為訓練集 # 剩下的50個觀測點作為測試集 # 由于skfeature中的CFS僅適用于離散變量 # 因此我們通過將float轉(zhuǎn)換為int而把所有連續(xù)變量轉(zhuǎn)換為離散變量 # 此轉(zhuǎn)換僅用于演示目的train_set = X[0:100,:].astype(int) test_set = X[100:,].astype(int) train_y = y[0:100].astype(int)num_feature = 2 # 從原數(shù)據(jù)集中選擇兩個變量feature_index = CFS.cfs(train_set, train_y) # 在訓練集上訓練 transformed_train = train_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換訓練集 assert np.array_equal(transformed_train, train_set[:,[3,2]]) # 其選擇了第三個及第四個變量transformed_test = test_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換測試集 assert np.array_equal(transformed_test, test_set[:,[3,2]]) # 其選擇了第三個及第四個變量1.1.2.3 Fast Correlation-based Filter (FCBF) 基于相關(guān)性的快速特征選擇
相比于CFS,FCBS能夠更加高效的篩選變量。其同樣為逐步(step-wise)的方法,具體步驟與mRMR非常類似,但FCBS使用對稱不確定性(SU)衡量變量間的關(guān)聯(lián)性。FCBF首先剔除與目標變量具有較低SU值的變量,并對剩下的變量按與目標變量的SU值從最高到最低排序,然后逐一刪除冗余特征。與mRMR,CFS相似,在skfeature中實現(xiàn)的FCBF僅適用于具有離散變量的分類問題。
公式:
步驟:?
1)計算每個特征變量 ???????? 與目標變量 ???? 之間的相關(guān)性 ????????(????????,????)?
2)僅保留 ????????(????????,????) 大于一定閾值 ???? 的特征變量,組成候選列表 ?????????????????????
3)按照 ????????(????????,????) 值的大小對 ???????????????????? 中的變量從大到小排序?
4)按順序依次計算每一個特征 ???????? 與候選列表 ???????????????????? 中順序靠后的每一個特征 ???????? 的相關(guān)SU值 ????????(????????,????????)?
5)若 ????????(????????,????????) 大于 ????????(????????,????) ,則從候選列表 ???????????????????? 中刪除 ????????
import numpy as np from skfeature.function.information_theoretical_based import FCBF from sklearn.datasets import load_iris # 利用iris數(shù)據(jù)作為演示數(shù)據(jù)集# 載入數(shù)據(jù)集 iris = load_iris() X, y = iris.data, iris.target# 選擇前100個觀測點作為訓練集 # 剩下的50個觀測點作為測試集 # 由于skfeature中的FCFS僅適用于離散變量 # 因此我們通過將float轉(zhuǎn)換為int而把所有連續(xù)變量轉(zhuǎn)換為離散變量 # 此轉(zhuǎn)換僅用于演示目的train_set = X[0:100,:].astype(int) test_set = X[100:,].astype(int) train_y = y[0:100].astype(int)num_feature = 2 # 從原數(shù)據(jù)集中選擇兩個變量feature_index = FCBF.fcbf(train_set, train_y, n_selected_features = num_feature)[0] # 在訓練集上訓練 transformed_train = train_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換訓練集 assert np.array_equal(transformed_train, train_set[:,[3]]) # 其僅選擇了第四個變量 # 這是由于其他變量目標變量????之間的相關(guān)性過低造成的transformed_test = test_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換測試集 assert np.array_equal(transformed_test, test_set[:,[3]]) # 其僅選擇了第四個變量1.1.2.4 ReliefF
ReliefF方法是一種基于Relief方法的特征加權(quán)算法。在Relief方法中,其根據(jù)特征與目標變量的相關(guān)性強弱(二分類)給變量分配權(quán)重,并刪除權(quán)重低于特定閾值的特征。其將相關(guān)性定義為變量區(qū)分鄰近觀測點的能力。
具體來說,在每一步中,Relief方法都會從訓練集中隨機選擇一個觀測點S,然后找到具有相同目標標簽的S的最近鄰觀測點,稱為NearHit。它還將找到具有不同目標標簽的S的最近鄰觀測點,稱為NearMiss。然后根據(jù)以下規(guī)則更新每個功能的權(quán)重:
1)若觀測點S在某變量上與NearHit的距離大于與NearMiss的距離,則該變量的權(quán)重將增加,因為變量有助于區(qū)分最鄰近情形下的目標標簽。2)相反,若觀測點S在某變量上與NearHit的距離小于與NearMiss的距離,則該變量的權(quán)重會降低。
將上述過程重復m次,最后我們會獲得每個特征變量的平均權(quán)重。特征變量的權(quán)重越大,則特征的分類能力越強,越應(yīng)該被留在最終的特征子集中。
在ReliefF中,其修改了權(quán)重更新的方式,因此ReliefF方法可以被應(yīng)用于多類分類問題。另外,它隨機采樣K個最近的觀測點而不是一個。
在skfeature中實現(xiàn)的ReliefF可用于分類問題中的連續(xù)特征或二元類別特征,因其使用的是L1范數(shù)來衡量差異。針對非二元特征,我們可以先將其獨熱編碼,再使用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數(shù)據(jù)作為演示數(shù)據(jù)集# 載入數(shù)據(jù)集 iris = load_iris() X, y = iris.data, iris.target# 選擇前100個觀測點作為訓練集 # 剩下的50個觀測點作為測試集 # skfeature中的reliefF直接適用于連續(xù)變量train_set = X[0:100,:] test_set = X[100:,] train_y = y[0:100]num_feature = 2 # 從原數(shù)據(jù)集中選擇兩個變量score = reliefF.reliefF(train_set, train_y) # 計算每一個變量的權(quán)重 feature_index = reliefF.feature_ranking(score) # 依據(jù)權(quán)重選擇變量 transformed_train = train_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換訓練集 assert np.array_equal(transformed_train, train_set[:,[2, 3]]) # 其選擇了第三個及第四個變量transformed_test = test_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換測試集 assert np.array_equal(transformed_test, test_set[:,[2, 3]]) # 其選擇了第三個及第四個變量1.1.2.5?Spectral Feature Selection (SPEC) 基于譜圖的特征選擇
基于譜圖的特征選擇(SPEC)方法是基于譜圖理論的無監(jiān)督方法。其首先建立變量相似度集合S,并建立其圖表示。然后,其根據(jù)構(gòu)造圖的頻譜評估特征。由于在skfeature中實現(xiàn)的SPEC方基于RBF(高斯)內(nèi)核建立相似集,因此其可用于分類問題中的連續(xù)特征或二元類別特征。針對非二元特征,我們可以先將其獨熱編碼,再使用ReliefF方法。
import numpy as np from skfeature.function.similarity_based import SPEC from sklearn.datasets import load_iris # 利用iris數(shù)據(jù)作為演示數(shù)據(jù)集# 載入數(shù)據(jù)集 iris = load_iris() X, y = iris.data, iris.target# 選擇前100個觀測點作為訓練集 # 剩下的50個觀測點作為測試集 # skfeature中的SEPC方法直接適用于連續(xù)變量train_set = X[0:100,:] test_set = X[100:,] train_y = y[0:100]num_feature = 2 # 從原數(shù)據(jù)集中選擇兩個變量score = SPEC.spec(train_set) # 計算每一個變量的得分 feature_index = SPEC.feature_ranking(score) #依據(jù)變量得分選擇變量 transformed_train = train_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換訓練集 assert np.array_equal(transformed_train, train_set[:,[1, 0]]) # 其選擇了第一個及第二個變量transformed_test = test_set[:,feature_index[0:num_feature]] # 轉(zhuǎn)換測試集 assert np.array_equal(transformed_test, test_set[:,[1, 0]]) # 其選擇了第一個及第二個變量專欄系列:
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(一)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(二)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(三)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預處理(四)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(一)
專欄 | 基于Jupyter 的特征工程手冊:特征選擇(二)
目前該項目完整中文版正在制作中,請持續(xù)關(guān)注哦~
中文版 Jupyter 地址:
https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/中文版/2.%20特征選擇.ipynb
推薦閱讀
(點擊標題可跳轉(zhuǎn)閱讀)
干貨 | 公眾號歷史文章精選
我的深度學習入門路線
我的機器學習入門路線圖
算法工程師必備!
AI有道年度技術(shù)文章電子版PDF來啦!
掃描下方二維碼,添加?AI有道小助手微信,可申請入群,并獲得2020完整技術(shù)文章合集PDF(一定要備注:入群?+ 地點 + 學校/公司。例如:入群+上海+復旦。?
長按掃碼,申請入群
(添加人數(shù)較多,請耐心等待)
?
最新 AI 干貨,我在看?
總結(jié)
以上是生活随笔為你收集整理的专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CString LPCTSTR LPTS
- 下一篇: 专栏 | 基于 Jupyter 的特征工