日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征选择(过滤法、包装法、嵌入法)

發布時間:2024/3/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征选择(过滤法、包装法、嵌入法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Filter過濾式方法
    • 方差選擇法
    • 相關系數法
    • 卡方檢驗
    • 互信息法和最大信息系數Mutual information and maximal information coefficient (MIC)
  • Wrapper封裝式方法
    • 遞歸特征消除法Recursive feature elimination (RFE)
  • Embedded過濾式方法
    • 基于懲罰項的特征選擇法
      • L1L_{1}L1?正則化Lasso
      • L2正則化Ridge regression
    • 基于樹模型的特征選擇法
      • 平均不純度減少 mean decrease impurity
      • 平均精確率減少 Mean decrease accuracy
      • 決定節點分裂的次數
      • 隨機森林進行特征選擇
      • 決策樹進行特征選擇
      • XGBoost進行特征選擇
  • PCA
  • LDA

有這么一句話在業界廣泛流傳:數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。特征工程目的是最大限度地從原始數據中提取特征以供算法和模型使用。這里主要說的是特征選擇。

當數據預處理完成后,我們需要進行特征選擇,即選擇有意義的特征輸入機器學習的算法和模型進行訓練。特征選擇主要有兩個功能:

  • 減少特征數量、降維,使模型泛化能力更強,減少過擬合。
  • 去掉似是而非不易判別的特征,提高精度。

通常來說,從兩個方面考慮來選擇特征:

  • 特征是否發散:如果一個特征不發散,例如方差接近于0,那么就是說樣本在這個特征上基本上沒有差異,這個特征對于樣本的區分并沒有什么用。
  • 特征與目標的相關性:這點比較顯而易見,與目標相關性高的特征,應當優選選擇。
    根據特征選擇的形式又可以將特征選擇方法分為3種:

Filter:過濾法,按照發散性或者相關性對各個特征進行評分,設定閾值或者待選擇閾值的個數,選擇特征。
Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特征,或者排除若干特征。
Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特征的權值系數,根據系數從大到小選擇特征。類似于Filter方法,但是是通過訓練來確定特征的優劣。

Filter過濾式方法

過濾式方法(Filter)通常是獨立地選擇特征,這可能會忽略特征組合之間的相關性。

方差選擇法

使用方差選擇法,先要計算各個特征的方差,然后根據閾值,選擇方差大于閾值的特征。使用feature_selection庫的VarianceThreshold類來選擇特征的代碼如下:

from sklearn.feature_selection import VarianceThreshold # 方差選擇法,返回值為特征選擇后的數據 # 參數threshold為方差的閾值 VarianceThreshold(threshold=3).fit_transform(iris.data) # iris.data為鳶尾花數據

相關系數法

使用相關系數法,先要計算各個特征對目標值的相關系數以及相關系數的P值。用feature_selection庫的SelectKBest類結合相關系數來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr #選擇K個最好的特征,返回選擇特征后的數據 #第一個參數為計算評估特征是否好的函數,該函數輸入特征矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項為第i個特征的評分和P值。在此定義為計算相關系數 #參數k為選擇的特征個數 SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

卡方檢驗

經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等于i且因變量等于j的樣本頻數的觀察值與期望的差距,構建統計量:
χ2=∑(A?E)2E\chi^{2}=\frac{\sum (A-E)^{2}}{E} χ2=E(A?E)2?
用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 #選擇K個最好的特征,返回選擇特征后的數據 SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

互信息法和最大信息系數Mutual information and maximal information coefficient (MIC)

經典的互信息也是評價定性自變量對定性因變量的相關性的,互信息計算公式如下:
I(X;Y)=∑x?X∑y?Yp(x,y)logp(x,y)p(x)p(y))I(X;Y)= \sum_{x\epsilon X} \sum_{y\epsilon Y}p(x,y)log \frac{p(x,y)}{p(x)p(y))} I(X;Y)=x?X?y?Y?p(x,y)logp(x)p(y))p(x,y)?
若想把互信息直接用于特征選擇其實不是太方便:1、它不屬于度量方式,也沒有辦法歸一化,在不同數據及上的結果無法做比較;2、對于連續變量的計算不是很方便(X和Y都是集合,x,y都是離散的取值),通常變量需要先離散化,而互信息的結果對離散化的方式很敏感。最大信息系數克服了這兩個問題。它首先尋找一種最優的離散化方式,然后把互信息取值轉換成一種度量方式,取值區間在[0,1]。
使用feature_selection庫的SelectKBest類結合最大信息系數法來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest from minepy import MINE #由于MINE的設計不是函數式的,定義mic方法將其為函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5 def mic(x, y):m = MINE()m.compute_score(x, y)return (m.mic(), 0.5) #選擇K個最好的特征,返回特征選擇后的數據 SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

Wrapper封裝式方法

遞歸特征消除法Recursive feature elimination (RFE)

遞歸特征消除的主要思想是反復的構建模型(如SVM或者回歸模型)然后選出最差的(或者最好的)的特征(可以根據系數來選),把選出來的特征放到一邊,然后在剩余的特征上重復這個過程,直到所有特征都遍歷了。這個過程中特征被消除的次序就是特征的排序。因此,這是一種尋找最優特征子集的貪心算法。

RFE的穩定性很大程度上取決于在迭代的時候底層用哪種模型。例如,假如RFE采用的普通的回歸,沒有經過正則化的回歸是不穩定的,那么RFE就是不穩定的;假如采用的是Ridge,而用Ridge正則化的回歸是穩定的,那么RFE就是穩定的。
使用feature_selection庫的RFE類來選擇特征的代碼如下:

from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression #遞歸特征消除法,返回特征選擇后的數據 #參數estimator為基模型 #參數n_features_to_select為選擇的特征個數 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

Embedded過濾式方法

基于懲罰項的特征選擇法

基于懲罰項的特征選擇法其實是基于正則的特征選擇法。正則化就是把額外的約束或者懲罰項加到已有模型(損失函數)上,以防止過擬合并提高泛化能力。損失函數由原來的E(X,Y)E(X,Y)E(X,Y)變為E(X,Y)+α∣∣w∣∣E(X,Y)+\alpha||w||E(X,Y)+αw,w是模型系數組成的向量(有些地方也叫參數parameter,coefficients),||·||一般是L1L_{1}L1?或者L2L_{2}L2?范數,α\alphaα是一個可調的參數,控制著正則化的強度。當用在線性模型上時,L1L_{1}L1?正則化和L2L_{2}L2?正則化也稱為Lasso和Ridge。

L1L_{1}L1?正則化Lasso

L1L_{1}L1?正則化將系數w的l1范數作為懲罰項加到損失函數上,由于正則項非零,這就迫使那些弱的特征所對應的系數變成0。因此L1L_{1}L1?正則化往往會使學到的模型很稀疏(系數w經常為0),這個特性使得L1L_{1}L1?正則化成為一種很好的特征選擇方法。

L2正則化Ridge regression

L2L_{2}L2?正則化將系數向量的L2L_{2}L2?范數添加到了損失函數中。由于L2L_{2}L2?懲罰項中系數是二次方的,這使得L2L_{2}L2?L1L_{1}L1?有著諸多差異,最明顯的一點就是,L2L_{2}L2?正則化會讓系數的取值變得平均。對于關聯特征,這意味著他們能夠獲得更相近的對應系數。以Y=X1+X2為例,假設X1和X2具有很強的關聯,如果用L1正則化,不論學到的模型是Y=X1+X2還是Y=2X1,懲罰都是一樣的,都是2 alpha。但是對于L2來說,第一個模型的懲罰項是2α\alphaα,但第二個模型的是4*α\alphaα。可以看出,系數之和為常數時,各系數相等時懲罰是最小的,所以才有了L2會讓各個系數趨于相同的特點。

基于樹模型的特征選擇法

樹模型有準確率高、魯棒性好、易于使用等優點,這使得它成為了目前最流行的機器學習算法之一。

平均不純度減少 mean decrease impurity

隨機森林由多個決策樹構成。決策樹中的每一個節點都是關于某個特征的條件,為的是將數據集按照不同的響應變量進行分裂。利用不純度可以確定節點基于哪個特征進行分裂,對于分類問題,通常采用基尼系數或者信息增益 ,對于回歸問題,通常采用的是方差或者最小二乘擬合。當訓練決策樹的時候,可以計算出每個特征減少了多少樹的不純度。對于一個決策樹森林來說,可以算出每個特征平均減少了多少不純度,并把它平均減少的不純度作為特征選擇的值。

平均精確率減少 Mean decrease accuracy

另一種常用的特征選擇方法就是直接度量每個特征對模型精確率的影響。主要思路是打亂每個特征的特征值順序,并且度量順序變動對模型的精確率的影響。很明顯,對于不重要的變量來說,打亂順序對模型的精確率影響不會太大,但是對于重要的變量來說,打亂順序就會降低模型的精確率。

決定節點分裂的次數

查看每個特征作為節點分裂依據的次數,次數越多則認為這個特征越重要。根據次數對特征進行排序。

隨機森林進行特征選擇

特征重要性?度量
1)對每一顆決策樹,選擇相應的袋外數據(out of bag,OOB)?計算袋外數據誤差,記為errOOB1。
所謂袋外數據是指,每次建立決策樹時,通過重復抽樣得到一個數據用于訓練?決策樹,這時還有大約1/3的數據沒有被利用,沒有參與決策樹的建立。這部分數據可以用于對決策樹的性能進行評估,計算模型的預測錯誤率,稱為袋外數據誤差。
?這已經經過證明是無偏估計的,所以在隨機森林算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
?2)隨機對袋外數據OOB所有樣本的特征X加入噪聲干擾(可以隨機改變樣本在特征X處的值),再次計算袋外數據誤差,記為errOOB2。
3)?假設森林中有N棵樹,則特征X的重要性=∑(errOOB2-errOOB1)/N。這個數值之所以能夠說明特征的重要性是因為,如果加入隨機噪聲后,袋外數據準確率大幅度下降(即errOOB2上升),說明這個特征對于樣本的預測結果有很大影響,進而說明重要程度比較高。
特征選擇
在特征重要性的基礎上,特征選擇的步驟如下:
1)計算每個特征的重要性,并按降序排序
2)確定要剔除的比例,依據特征重要性剔除相應比例的特征,得到一個新的特征集
3)用新的特征集重復上述過程,直到剩下m個特征(m為提前設定的值)。
4)根據上述過程中得到的各個特征集和特征集對應的袋外誤差率,選擇袋外誤差率最低的特征集。?

決策樹進行特征選擇

加權不純度的減少

import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.externals.six import StringIO from sklearn import tree import pydotplusclf = DecisionTreeClassifier() x = [[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],[1,1,2,2,1,1,1,2,1,1,1,1,2,2,1],[1,1,1,2,1,1,1,2,2,2,2,2,1,1,1],[1,2,2,1,1,1,2,2,3,3,3,2,2,3,1]] y = [1,1,2,2,1,1,1,2,2,2,2,2,2,2,1] x = np.array(x) x = np.transpose(x) clf.fit(x,y) print(clf.feature_importances_) feature_name = ['A1','A2','A3','A4'] target_name = ['1','2'] dot_data = StringIO() tree.export_graphviz(clf,out_file = dot_data,feature_names=feature_name,class_names=target_name,filled=True,rounded=True,special_characters=True) graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) graph.write_pdf("WineTree.pdf") print('Visible tree plot saved as pdf.')

XGBoost進行特征選擇

在XGBoost中提供了三種特征重要性的計算方法:

‘weight’ - the number of times a feature is used to split the data across all trees. ‘gain’ - the average gain of the feature when it is used in trees ‘cover’ - the average coverage of the feature when it is used in trees

weight就是在所有樹中特征用來分割的節點個數總和;
gain就是特征用于分割的平均增益
cover

import xgboost as xgb import numpy as np x = [[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],[1,1,2,2,1,1,1,2,1,1,1,1,2,2,1],[1,1,1,2,1,1,1,2,2,2,2,2,1,1,1],[1,2,2,1,1,1,2,2,3,3,3,2,2,3,1]] y = [0,0,1,1,0,0,0,1,1,1,1,1,1,1,0] x = np.array(x) x = np.transpose(x)params = {'max_depth': 10,'subsample': 1,'verbose_eval': True,'seed': 12,'objective':'binary:logistic' } xgtrain = xgb.DMatrix(x, label=y) bst = xgb.train(params, xgtrain, num_boost_round=10)fmap = 'weight' importance = bst.get_score(fmap = '',importance_type=fmap) print(importance) print(bst.get_dump(with_stats=False))fmap = 'gain' importance = bst.get_score(fmap = '',importance_type=fmap) print(importance) print(bst.get_dump(with_stats=True))fmap = 'cover' importance = bst.get_score(fmap = '',importance_type=fmap) print(importance) print(bst.get_dump(with_stats=True))

結果如下:

#使用weight的結果為 {‘f0’: 1, ‘f1’: 3, ‘f2’: 5, ‘f3’: 2}#使用gain的結果為 {‘f0’: 0.440551, ‘f1’: 1.8495799999999998, ‘f2’: 1.9555256, ‘f3’: 1.492955}#使用cover的結果為 {‘f0’: 2.89962, ‘f1’: 3.34311, ‘f2’: 3.2390999999999996, ‘f3’: 2.757295}

可以看出,不同的特征重要性度量方法得出的結果也是不盡相同的。

PCA

LDA

參考:
https://www.cnblogs.com/bonelee/p/8632866.html
https://blog.csdn.net/akenseren/article/details/80816210
卡方分布
https://blog.csdn.net/bitcarmanlee/article/details/52279907
樹特征選擇
https://blog.csdn.net/tinkle181129/article/details/80231871

總結

以上是生活随笔為你收集整理的特征选择(过滤法、包装法、嵌入法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。