06_特徵選擇,特徵選擇的原因,sklearn特徵選擇API

1、特徵選擇

在現實生活中,一個對象往往具有很多屬性(以下稱爲特徵),這些特徵大致可以被分成三種主要的類型:
1、相關特徵: 對於學習任務(例如分類問題)有幫助,可以提升學習算法的效果;
2、無關特徵: 對於我們的算法沒有任何幫助,不會給算法的效果帶來任何提升;
3、冗餘特徵: 不會對我們的算法帶來新的信息,或者這種特徵的信息可以由其他的特徵推斷出

但是對於一個特定的學習算法來說,哪一個特徵是有效的是未知的。因此,需要從所有特徵中選擇出對於學習算法有益的相關特徵。而且在實際應用中,經常會出現維度災難問題,尤其是在文本處理中。例如,可以把一篇文檔表示成一個詞向量,但是往往會使用所有的單詞作爲字典,因此對於一篇可能僅僅包含100或者200個單詞的文檔,可能需要上萬的維度(也就是特徵)。如果可以從中選擇一部分相關特徵構建模型,這個問題就可以得到一定程度的解決。所以,特徵選擇和降維有一定的相似之處。另外,從上面的例子中可以發現,如果只選擇所有特徵中的部分特徵構建模型,那麼可以大大減少學習算法的運行時間,也可以增加模型的可解釋性。

因此,進行特徵選擇的主要目的:
1、降維
2、降低學習任務的難度
3、提升模型的效率

定義:
從N個特徵中選擇其中M(M<N)個子特徵,並且在M個子特徵中,準則函數可以達到最優解。

特徵選擇想要做的是:選擇儘可能少的子特徵,模型的效果不會顯著下降,並且結果的類別分佈儘可能的接近真實的類別分類

特徵選擇的過程:
對於一個有N個特徵的對象,可以產生2^N個特徵子集,特徵選擇就是從這些子集中選出對於特定任務最好的子集。特徵選擇主要包括四個過程:

1、生成過程:生成候選的特徵子集
2、評價函數:評價特徵子集的好壞
3、停止條件:決定什麼時候該停止
4、驗證過程:特徵子集是否有效

在這裏插入圖片描述
生成過程其實是一個搜索過程,這個過程可以從以下幾種情況開始:
1、沒有特徵
2、所有特徵
3、隨機特徵子集。
在前兩種情況下,每次迭代可以增加、刪除特徵;但是在最後一種情況下,每次迭代隨機增加或者刪除特徵。

評價函數用來評價生成過程中生成的特徵子集,產生一個值用來比較當前特徵子集和當前最有特徵子集,如果這個特徵子集更好,那麼就取代當前最優子集。

停止條件用來決定迭代過程什麼時候停止,生成過程和評價函數可能會對於怎樣選擇停止條件產生影響。停止條件有以下四種選擇:
1、達到預定義的最大迭代次數;
2、達到預定義的最大特徵數
3、增加(刪除)任何特徵不會產生更好的特徵子集;
4、根據評價函數,產生最優特徵子集。

驗證過程並不是特徵選擇本身的一部分,但是選擇出的特徵必須是有效。因此,需要使用不同的測試集、學習方法驗證選擇出來的特徵子集,然後比較這些驗證結果。

生成過程:
生成過程是一個搜索過程,這個過程主要有以下三個策略:
1、完全搜索:根據評價函數做完全搜索。完全搜索主要有兩種:窮舉搜索和非窮舉搜索;
2、啓發式搜索:根據一些啓發式規則在每次迭代時,決定剩下的特徵是應該被選擇還是被拒絕。這種方法很簡單並且速度很快,因爲它的搜索空間是O(n^2);
3、隨機搜索:每次迭代時會設置一些參數,參數的選擇會影響特徵選擇的效果。由於會設置一些參數(例如最大迭代次數),所以搜索空間也遠遠小於O(2^n)

評價函數:
評價函數主要用來評價選出的特徵子集的好壞,一個特徵子集是最優的往往指相對於特定的評價函數來說的。評價函數主要用來度量一個特徵(或者特徵子集)可以區分不同類別的能力。根據具體的評價方法主要有三類:

1、過濾式(filter): 先進行特徵選擇,然後去訓練學習器,所以特徵選擇的過程與學習器無關。相當於先對於特徵進行過濾操作,然後用特徵子集來訓練分類器。
2、包裹式(wrapper): 直接把最後要使用的分類器作爲特徵選擇的評價函數,對於特定的分類器選擇最優的特徵子集。
3、Filter和Wrapper組合式算法: 先使用Filter進行特徵選擇,去掉不相關的特徵,降低特徵維度;然後利用Wrapper進行特徵選擇。
4、嵌入式(embedding): 把特徵選擇的過程與分類器學習的過程融合一起,在學習的過程中進行特徵選擇。最常見的使用L1正則化進行特徵選擇。

一般有5中比較常見的評價函數:
1、距離度量: 如果 X 在不同類別中能產生比 Y 大的差異,那麼就說明 X 要好於 Y;
2、信息度量: 主要是計算一個特徵的信息增益(度量先驗不確定性和期望後驗不確定性之間的差異);
3、依賴度量: 主要用來度量從一個變量的值預測另一個變量值的能力。最常見的是相關係數:用來發現一個特徵和一個類別的相關性。如果 X 和類別的相關性高於 Y與類別的相關性,那麼X優於Y。對相關係數做一點改變,用來計算兩個特徵之間的依賴性,值代表着兩個特徵之間的冗餘度。
4、一致性度量: 對於兩個樣本,如果它們的類別不同,但是特徵值是相同的,那麼它們是不一致的;否則是一致的。找到與全集具有同樣區分能力的最小子集。嚴重依賴於特定的訓練集和 最小特徵偏見(Min-Feature bias)的用法;找到滿足可接受的不一致率(用戶指定的參數)的最小規模的特徵子集。
5、誤分類率度量: 主要用於Wrapper式的評價方法中。使用特定的分類器,利用選擇的特徵子集來預測測試集的類別,用分類器的準確率來作爲指標。這種方法準確率很高,但是計算開銷較大。

以上摘自:
https://blog.csdn.net/hren_ron/article/details/80914491

1.1 特徵選擇原因

冗餘:部分特徵的相關度高,容易消耗計算性能
噪聲:部分特徵對預測結果有負影響

1.1 特徵選擇是什麼?

特徵選擇就是單純地從提取到的所有特徵中選擇部分特徵作爲訓練集特徵,特徵在選擇前和選擇後可以改變值、也不改變值,但是選擇後的特徵維數肯定比選擇前小,畢竟我們只選擇了其中的一部分特徵。

主要方法(三大武器):Filter(過濾式):VarianceThreshold
Embedded(嵌入式):正則化、決策樹
Wrapper(包裹式)

1.2 sklearn特徵選擇API

sklearn.feature_selection.VarianceThreshold

VarianceThreshold語法:

VarianceThreshold(threshold = 0.0)
     A:刪除所有低方差特徵

     B:Variance.fit_transform(X,y) 
        1、X:numpy array格式的數據[n_samples,n_features]
        2、返回值:訓練集差異低於threshold的特徵將被刪除。
        3、默認值是保留所有非零方差特徵,即刪除所有樣本
        4、中具有相同值的特徵。

VarianceThreshold流程(代碼演示)
1、初始化VarianceThreshold,指定閥值方差
2、調用fit_transform

例如處理:

[[0, 2, 0, 3], 
[0, 1, 4, 3], 
[0, 1, 1, 3]]
from sklearn.feature_selection import VarianceThreshold

def var():
    """
    特徵選擇--刪除低方差的特徵
    :return: None
    """
    var = VarianceThreshold(threshold=1.0)
    data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
    print(data)
    return None

if __name__ == "__main__":
    var()

輸出結果爲:

[[0]
 [4]
 [1]]

我們發現在三組數據裏,我們發現第一列,(注意是觀察每一列的數據)全是0,第二列方差小於1,第四列也是相同的值,那麼這些列的區分度就會很微弱,也就不具備分析的價值了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章