sklearn——特征選擇


一、關於特征選擇

主要參考連接為:參考鏈接,里面有詳細的特征選擇內容。

介紹

特征選擇特征工程里的一個重要問題,其目標是尋找最優特征子集。特征選擇能剔除不相關(irrelevant)或冗余(redundant )的特征,從而達到減少特征個數,提高模型精確度,減少運行時間的目的。另一方面,選取出真正相關的特征簡化模型,協助理解數據產生的過程。並且常能聽到“數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已”,由此可見其重要性。但是它幾乎很少出現於機器學習書本里面的某一章。然而在機器學習方面的成功很大程度上在於如果使用特征工程。

之所以要考慮特征選擇,是因為機器學習經常面臨過擬合的問題。 過擬合的表現是模型參數太貼合訓練集數據,模型在訓練集上效果很好而在測試集上表現不好,也就是在高方差。簡言之模型的泛化能力差。過擬合的原因是模型對於訓練集數據來說太復雜,要解決過擬合問題,一般考慮如下方法:

  1. 收集更多數據
  2. 通過正則化引入對復雜度的懲罰
  3. 選擇更少參數的簡單模型
  4. 對數據降維(降維有兩種方式:特征選擇和特征抽取)

其中第1條一般是很難做到的,一般主要采用第2和第4點

一般流程

特征選擇的一般過程:

  1. 生成子集:搜索特征子集,為評價函數提供特征子集
  2. 評價函數:評價特征子集的好壞
  3. 停止准則:與評價函數相關,一般是閾值,評價函數達到一定標准后就可停止搜索
  4. 驗證過程:在驗證數據集上驗證選出來的特征子集的有效性

但是, 當特征數量很大的時候, 這個搜索空間會很大,如何找最優特征還是需要一些經驗結論。

三大類方法

根據特征選擇的形式,可分為三大類:

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

 

二、Filter方法

過濾法

基本想法是:分別對每個特征 x_i ,計算 x_i 相對於類別標簽 y 的信息量 S(i) ,得到 n 個結果。然后將 n 個 S(i) 按照從大到小排序,輸出前 k 個特征。顯然,這樣復雜度大大降低。那么關鍵的問題就是使用什么樣的方法來度量 S(i) ,我們的目標是選取與 y 關聯最密切的一些 特征x_i 。

  • Pearson相關系數
  • 卡方驗證
  • 互信息和最大信息系數
  • 距離相關系數
  • 方差選擇法

 

sklearn使用到的內容主要為:

from sklearn.feature_selection import SelectKBest

 

 1、英文源碼介紹:

 
class SelectKBest(score_func=f_classif,k=10):
 
    """
Select features according to the k highest scores.
Read more in the :ref:`User Guide <univariate_feature_selection>`.
Parameters
----------
    score_func : callable
  Function taking two arrays X and y, and returning a pair of arrays (scores, pvalues) or a single array with scores.
  Default is f_classif (see below "See also"). The default function only works with classification tasks.
 
    k : int or "all", optional, default=10
  Number of top features to select. The "all" option bypasses selection, for use in a parameter search.

 

Attributes
----------
    scores_ : array-like, shape=(n_features,)
        Scores of features.
 
    pvalues_ : array-like, shape=(n_features,)
        p- values of feature scores, None if `score_func` returned only scores.
 
Notes
-----
 Ties between features with equal scores will be broken in an unspecified way.

 

See also
--------
    f_classif: ANOVA F- value between label/feature for classification tasks.
 mutual_info_classif: Mutual information for a discrete target.
    chi2: Chi-squared stats of non-negative features for classification tasks.
    f_regression: F- value between label/feature for regression tasks.
    mutual_info_regression: Mutual information for a continuous target.
    SelectPercentile: Select features based on percentile of the highest scores.
    SelectFpr: Select features based on a false positive rate test.
    SelectFdr: Select features based on an estimated false discovery rate.
    SelectFwe: Select features based on family-wise error rate.
    GenericUnivariateSelect: Univariate feature selector with configurable mode.
"""

2、參數說明

 score_func:callable,函數取兩個數組X和y,返回一對數組(scores, pvalues)或一個分數的數組。默認函數為f_classif,計算F分數,默認函數只適用於分類函數。

k:int or "all", optional, default=10。所選擇的topK個特征。“all”選項則繞過選擇,用於參數搜索。

 

3、屬性說明

scores_ : array-like, shape=(n_features,),特征的得分
pvalues_ : array-like, shape=(n_features,),特征得分的p_value值,如果score_func只返回分數,則返回None。

 

4、方法說明

fit(X,y),在(X,y)上運行記分函數並得到適當的特征。
fit_transform(X[, y]),擬合數據,然后轉換數據。
get_params([deep]),獲得此估計器的參數。
get_support([indices]),獲取所選特征的掩碼或整數索引。
inverse_transform(X),反向變換操作。
set_params(**params),設置估計器的參數。
transform(X),將X還原為所選特征

 

Pearson相關系數

皮爾森相關系數是一種最簡單的,能幫助理解特征和響應變量之間關系的方法,衡量的是變量之間的線性相關性,結果的取值區間為[-1,1] , -1 表示完全的負相關(這個變量下降,那個就會上升), +1 表示完全的正相關, 0 表示沒有線性相關性。Pearson Correlation速度快、易於計算,經常在拿到數據(經過清洗和特征提取之后的)之后第一時間就執行。Scipy的pearsonr方法能夠同時計算相關系數和p-value。

 

方法一:

pandas中,df.corr()可以直接計算相關系數

 

方法二:

import numpy as np
from scipy.stats import pearsonr

np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print("Lower noise:", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise:", pearsonr(x, x + np.random.normal(0, 10, size)))

from sklearn.feature_selection import SelectKBest
from sklearn import  datasets

iris=datasets.load_iris()

model=SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T[0],k=2)  #構建相關系數模型
model.fit_transform(iris.data, iris.target) #對模型將數據傳入
print('相關系數:',model.scores_)    #返回所有變量X與Y的相關系數值
print('P值:',model.pvalues_)   #返回所有變量X的P值
print('所選變量的數值為:\n',model.fit_transform(iris.data, iris.target))  #打印傳入數據的話會返回k=2所選擇的兩個變量的數據的值


 

卡方驗證

經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與期望的差距,構建統計量:

這個統計量的含義簡而言之就是自變量對因變量的相關性。用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特征的代碼如下:

import numpy as npfrom sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn import  datasets

iris=datasets.load_iris()

model=SelectKBest(chi2,k=2)  #構建相關系數模型
model.fit_transform(iris.data, iris.target) #對模型將數據傳入
print('卡方系數:',model.scores_)    #返回所有變量X與Y的相關系數值
print('P值:',model.pvalues_)   #返回所有變量X的P值
print('所選變量的數值為:\n',model.fit_transform(iris.data, iris.target))  #打印傳入數據的話會返回k=2所選擇的兩個變量的數據的值

 

互信息

經典的互信息也是評價定性自變量對定性因變量的相關性的,互信息計算公式如下:

為了處理定量數據,最大信息系數法被提出,使用feature_selection庫的SelectKBest類結合最大信息系數法來選擇特征的代碼如下:

import numpy as np
from sklearn.feature_selection import SelectKBest
from minepy import MINE
from sklearn import  datasets

iris=datasets.load_iris()

def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)

model=SelectKBest(lambda X,Y:np.array(list(map(lambda x:mic(x,Y),X.T))).T[0],,k=2)  #構建互信息數模型
model.fit_transform(iris.data, iris.target) #對模型將數據傳入
print('互信息系數:',model.scores_)    #返回所有變量X與Y的相關系數值
print('P值:',model.pvalues_)   #返回所有變量X的P值
print('所選變量的數值為:\n',model.fit_transform(iris.data, iris.target))  #打印傳入數據的話會返回k=2所選擇的兩個變量的數據的值

 

三、Wrapper方法

遞歸特征消除法

遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,消除若干權值系數的特征,再基於新的特征集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特征的代碼如下:

import numpy as np
from sklearn.feature_selection import RFE,RFECV
from sklearn.linear_model import LogisticRegression
from sklearn import  datasets

iris=datasets.load_iris()

# FECV()    #利用交叉驗證來選擇,不過這里的交叉驗證的數據集切割對象不再是 行數據(樣本),而是列數據(特征),但是計算量會大,cv默認是3
model=RFE(estimator=LogisticRegression(), n_features_to_select=2)   #構建邏輯回歸的遞歸消除模型
model.fit_transform(iris.data, iris.target) #傳入數據
print(model.classes_)   #返回遞歸消除得到的變量


四、 Embedded方法

基於L1、L2懲罰項的特征選擇法

使用帶懲罰項的基模型,除了篩選出特征外,同時也進行了降維。使用feature_selection庫的SelectFromModel類結合帶L1懲罰項的邏輯回歸模型,來選擇特征的代碼如下:

import numpy as np
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
from sklearn import  datasets

iris=datasets.load_iris()

#帶L1懲罰項的邏輯回歸作為基模型的特征選擇
model=SelectFromModel(LogisticRegression(penalty="l1", C=0.1))
model.fit_transform(iris.data, iris.target) #傳入數據
print(model.fit_transform(iris.data, iris.target))   #返回模型選擇的變量的數據內容

L2的特征選擇請參考連接:https://www.cnblogs.com/jasonfreak/p/5448385.html

 

五、基於樹模型的特征選擇

樹模型中GBDT也可用來作為基模型進行特征選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特征的代碼如下:

import numpy as np
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import  datasets

iris=datasets.load_iris()

#帶L1懲罰項的邏輯回歸作為基模型的特征選擇
model=SelectFromModel(GradientBoostingClassifier())
model.fit_transform(iris.data, iris.target) #傳入數據
print(model.fit_transform(iris.data, iris.target))   #返回模型選擇的變量的數據內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM