機器學習之特徵工程-特徵選擇
歡迎關注我們的微信公眾號「人工智慧LeadAI」(ID:atleadai)
一個基本的數據挖掘場景如下:
從上面的數據挖掘場景可知,當數據預處理完成後,我們需要選擇有意義的特徵,輸入機器學習的演算法模型進行訓練。通常來說,從兩個方面考慮來選擇特徵:
特徵是否發散:如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。
根據特徵選擇的形式又可以將特徵選擇方法分為3種:
- Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
- Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
- Embedded:集成法,先使用某些機器學習的演算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。
我們使用sklearn中的feature_selection庫來進行特徵選擇。
Filter
方差法
使用方差法,要先計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的VarianceThreshold類來選擇特徵的代碼如下:
from sklearn.datasets import load_irisnfrom sklearn.feature_selection import VarianceThresholdn#方差選擇法,返回值為特徵選擇後的數據n#參數threshold為方差的閾值niris = load_iris()nprint(iris.data[0])nprint(iris.target[0])nprint(VarianceThreshold(threshold=3).fit_transform(iris.data)[0])n
從結果看,只有第三個屬性符合,結果如下:
[ 5.1 3.5 1.4 0.2]0[ 1.4]
皮爾遜係數
皮爾遜係數只能衡量線性相關性,先要計算各個特徵對目標值的相關係數以及相關係數的P值。用feature_selection庫的SelectKBest類結合皮爾遜係數來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectKBestfrom scipy.stats import pearsonrfrom sklearn.datasets import load_irisn
iris=load_iris()#選擇K個最好的特徵,返回選擇特徵後的數據#第一個參數為計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項為第i個特徵的評分和P值。在此定義為計算相關係數#參數k為選擇的特徵個數# 定義函數def multivariate_pearsonr(X, y):
scores, pvalues = [], [] for ret in map(lambda x:pearsonr(x, y), X.T): scores.append(abs(ret[0])) pvalues.append(ret[1]) return (np.array(scores), np.array(pvalues))transformer = SelectKBest(score_func=multivariate_pearsonr, k=2)
Xt_pearson = transformer.fit_transform(iris.data, iris.target)print(Xt_pearson)卡方檢驗
只能用於二分類,經典的卡方檢驗是檢驗定性自變數對定性因變數的相關性。假設自變數有N種取值,因變數有M種取值,考慮自變數等於i且因變數等於j的樣本頻數的觀察值與期望的差距,構建統計量:
不難發現,這個統計量的含義簡而言之就是自變數對因變數的相關性(http://wiki.mbalib.com/wiki/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C)。用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectKBestfrom nsklearn.feature_selection import chi2n#選擇K個最好的特徵,返回選擇特徵後的數據nSelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)n
互信息法
互信息係數能夠很好地度量各種相關性,但是計算相對複雜一些,互信息計算公式如下:
使用feature_selection庫的SelectKBest類結合最大信息係數法來選擇特徵的代碼如下from sklearn.feature_selection import SelectKBestnfrom sklearn.feature_selection import mutual_info_classifn#選擇K個最好的特徵,返回選擇特徵後的數據nSelectKBest(mutual_info_classif, k=2).fit_transform(iris.data, iris.target)n
Wrapper
包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
遞歸特徵消除法
遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特徵的代碼如下:
from sklearn.feature_selection import RFEnfrom sklearn.linear_model import LogisticRegressionn#遞歸特徵消除法,返回特徵選擇後的數據n#參數estimator為基模型n#參數n_features_to_select為選擇的特徵個數nRFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data,iris.target)n
Embedded
集成法,先使用某些機器學習的演算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。
基於樹模型的特徵選擇法
樹模型中GBDT也可用來作為基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特徵的代碼如下:
from sklearn.feature_selection import SelectFromModelnfrom sklearn.ensemble import GradientBoostingClassifiern#GBDT作為基模型的特徵選擇SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)n
當然還有別的方法:
通過特徵組合後再來選擇特徵:如對用戶id和用戶特徵組合來獲得較大的特徵集再來選擇特徵,這種做法在推薦系統和廣告系統中比較常見,這也是所謂億級甚至十億級特徵的主要來源,原因是用戶數據比較稀疏,組合特徵能夠同時兼顧全局模型和個性化模型。
通過深度學習來進行特徵選擇:目前這種手段正在隨著深度學習的流行而成為一種手段,尤其是在計算機視覺領域,原因是深度學習具有自動學習特徵的能力,這也是深度學習又叫unsupervised feature learning的原因。從深度學習模型中選擇某一神經層的特徵後就可以用來進行最終目標模型的訓練了。
文中涉及源碼在此:源碼
皮爾遜係數
1、皮爾遜係數
2、普通數據挖掘場景
3、https://www.zhihu.com/question/29316149
4、sklearn feature selection
推薦閱讀:
※Unsupervised Personalized Feature Selection--閱讀筆記
※文本特徵選擇
※特徵選擇
※機器學習入門講解:什麼是特徵和特徵選擇
※機器學習中,有哪些特徵選擇的工程方法?