特徵選擇就是從原始特徵中選取一些最有效的特徵來降低維度,,提高模型泛化能力減低過擬合的過程,主要目的是剔除掉無關特徵和冗餘特徵,選出最優特徵子集。
計算各個特徵的方差,剔除小於設定的閾值的特徵,剔除特徵值 波動較小的特徵,例如乙個特徵的所有值都為1,那這個特徵對於**目標變數就沒什麼作用;方法很簡單,但實際應用中只有少數變數才會存在只取某個值的情況,對特徵選擇作用比較小,可以當做資料預處理部分,之後再用其他方法進行特徵選擇。
from sklearn.feature_selection import variancethreshold
sel = variancethreshold(threshold=
(100))
#選擇方差大於閾值的特徵
x=sel.fit_transform(x)
print
(x.shape)
#(20640, 5)
#variancethreshold返回已經提出方差為0的列,通過get_support[true]定位
#剩餘變數所在的列
皮爾森相關係數衡量的是變數之間的線性相關性,取值範圍在-1-+1之間,-1表示完全負相關,+1表示完全正相關,0表示線性無關;可以使用scipy的pearsonr 計算皮爾森相關係數,且它還可以同時計算出p值。皮爾森相關係數只衡量線性關係,即使兩個變數之間有較強的非線性關係,皮爾森係數也有可能接近為0。
import numpy as np
from scipy.stats import pearsonr
x = np.random.normal(0,
10,300)
y = x + np.random.normal(0,
10,300)
n=pearsonr(x,y)
print
(n)#(0.72216655438214117, 1.2694151127298612e-49)# 輸出:(r, p)# r:相關係數[-1,1]之間# p:相關係數顯著
相關性的強度確實是用相關係數的大小來衡量的,但相關大小的評價要以相關係數顯著性的評價為前提。
因此,要先檢驗相關係數的顯著性,如果顯著,證明相關係數有統計學意義,下一步再來看相關係數大小,如果相關係數沒有統計學意義,那意味著你研究求得的相關係數也許是抽樣誤差或者測量誤差造成的,再進行一次研究結果可能就大不一樣,此時討論相關性強弱的意義就大大減弱了。【p-value在500個樣本值以上有較高的可靠性】
在滿足相關係數顯著的條件下,相關係數越大,相關性就越強。一般來說皮爾森相關係數越大,p_value越小,線性相關性就越大。
當資料集的特徵過多時,容易產生過擬合,可以用隨機森林來在訓練之後可以產生乙個各個特徵重要性的資料集,利用這個資料集,確定乙個閾值,選出來對模型訓練幫助最大的一些特徵,篩選出重要變數後可以再訓練模型。
mean decrease impurity 不純度降低
最優條件的選擇依據是不純度。不純度在分類中通常為gini不純度或資訊增益/資訊熵,對於回歸問題來說是方差。
注意:(1)基於不純度降低的特徵選擇將會偏向於選擇那些具有較多類別的變數(bias)。
(2)當存在相關特徵時,乙個特徵被選擇後,與其相關的其他特徵的重要度則會變得很低,因為他們可以減少的不純度已經被前面的特徵移除了。
mean decrease accuracy 準確率降低
基本思想是重新排列某一列特徵值的順序,觀測降低了多少模型的準確率。對於不重要的特徵,這種方法對模型準確率的影響很小,但是對於重要特徵卻會極大降低模型的準確率。
from sklearn.ensemble import randomforestclassifier
clf = randomforestclassifier(
)clf.fit(x,y)
importance=clf.feature_importances_
indices=np.argsort(importance)
features=x.columns
for f in
range
(x.shape[1]
):print((
"%2d) %-*s %f"
%(f +1,
30, features[f]
, importance[indices[f]])
))
首先,評估器在初始的特徵集合上面訓練並且每乙個特徵的重要程度是通過乙個 coef_ 屬性 或者 feature_importances_ 屬性來獲得。 然後,從當前的特徵集合中移除最不重要的特徵。在特徵集合上不斷的重複遞迴這個步驟,直到最終達到所需要的特徵數量為止。
from sklearn.feature_selection import rfe
from sklearn.ensemble import gradientboostingclassifier
from sklearn import datasets
iris = datasets.load_iris(
)gbdt_rfe = rfe(estimator=gradientboostingclassifier(random_state=
123)
,n_features_to_select=2)
gbdt_rfe.fit(x, y)
#特徵選擇輸出結果
print
(gbdt_rfe.support_)
selectfrommodel是乙個 meta-transformer(元轉換器) ,它可以用來處理任何帶有 coef_ 或者 feature_importances_ 屬性的訓練之後的評估器。 如果相關的coef_
或者 featureimportances 屬性值低於預先設定的閾值,這些特徵將會被認為不重要並且移除掉。除了指定數值上的閾值之外,還可以通過給定字串引數來使用內建的啟發式方法找到乙個合適的閾值。可以使用的啟發式方法有 mean 、 median 以及使用浮點數乘以這些(例如,0.1*mean )
from sklearn.svm import linearsvc
from sklearn.datasets import load_iris
from sklearn.feature_selection import selectfrommodel
iris = load_iris(
)x, y = iris.data, iris.target
print
(x.shape)
lsvc = linearsvc(c=
0.01
, penalty=
"l1"
, dual=
false
).fit(x, y)
model = selectfrommodel(lsvc, prefit=
true
)x_new = model.transform(x)
print
(x_new.shape)
(1)對於理解資料、資料的結構、特點來說,單變數特徵選擇是個非常好的選擇。儘管可以用它對特徵進行排序來優化模型,但由於它不能發現冗餘(例如假如乙個特徵子集,其中的特徵之間具有很強的關聯,那麼從中選擇最優的特徵時就很難考慮到冗餘的問題)。
(2)正則化的線性模型對於特徵理解和特徵選擇來說是非常強大的工具。l1正則化能夠生成稀疏的模型,對於選擇特徵子集來說非常有用;相比起l1正則化,l2正則化的表現更加穩定,由於有用的特徵往往對應係數非零,因此l2正則化對於資料的理解來說很合適。由於響應變數和特徵之間往往是非線性關係,可以採用basis expansion的方式將特徵轉換到乙個更加合適的空間當中,在此基礎上再考慮運用簡單的線性模型。
(3)隨機森林是一種非常流行的特徵選擇方法,它易於使用,一般不需要feature engineering、調參等繁瑣的步驟,並且很多任務具包都提供了平均不純度下降方法。它的兩個主要問題,1是重要的特徵有可能得分很低(關聯特徵問題),2是這種方法對特徵變數類別多的特徵越有利(偏向問題)。儘管如此,這種方法仍然非常值得在你的應用中試一試。
(4)特徵選擇在很多機器學習和資料探勘場景中都是非常有用的。在使用的時候要弄清楚自己的目標是什麼,然後找到哪種方法適用於自己的任務。當選擇最優特徵以提公升模型效能的時候,可以採用交叉驗證的方法來驗證某種方法是否比其他方法要好。當用特徵選擇的方法來理解資料的時候要留心,特徵選擇模型的穩定性非常重要,穩定性差的模型很容易就會導致錯誤的結論。對資料進行二次取樣然後在子集上執行特徵選擇演算法能夠有所幫助,如果在各個子集上的結果是一致的,那就可以說在這個資料集上得出來的結論是可信的,可以用這種特徵選擇模型的結果來理解資料。
ML 常見的特徵選擇方法
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 11 20 在統計分析中,由於事先並不知道什麼特徵與這個模式相關,而特徵對能否正確分類又起到至關重要的作用,因此特徵選擇是統計學習中必不可少的一步。目前常用的特徵選擇方案總的來說可以分為基於統計的和基於模型的。基於統計的比如f值,資訊增益...
特徵選擇 常見方法總結
特徵選擇方法 目的 減少特徵數量 降維,使模型泛化能力更強,減少過擬合增強對特徵和特徵值之間的理解 方法 一 方差選擇法。from sklearn.feature selection import variancethreshold a.特徵值需為離散型變數,若是連續型,需要連續變數離散化。b.最簡...
特徵選擇方法
特徵獲取過程 特徵獲取定義的角度 特徵獲取要解決的兩個問題 啟發式方法為一種近似演算法,具有很強的主觀傾向。隨機方法是一種相對較新的方法,細分為完全隨機方法和概率隨機方法兩種。總的說來,上述三類中只有窮舉法能保證最優,但耗時並且計算複雜度很高,後兩者以效能為代價換取簡單 快速的實現,但不能保證最優。...