【Python】特征选择方法
??????特征選擇作用:
1. 減少特征數量、降維,加強模型的泛化能力,減少過擬合
2. 增強對特征和特征值之間的理解
特征選擇方法:
Pearson相關系數——單變量選擇
該方法衡量變量之間的線性相關性,取值范圍為【-1,1】、
-1表示完全負相關;0表示完全沒有線性關系;+1表示完全正相關。
優點:速度快,易于計算
缺點:只能衡量線性相關性
Python代碼:使用scipy.stats的 pearsonr函數:
import numpy as np from scipy.stats import pearsonrnp.random.seed(0) size = 300 x = np.random.normal(0, 1, size) y = x + np.random.normal(0, 1, size) print("Pearsonr", pearsonr(x, y))隨機森林回歸——單變量選擇
思路:直接使用機器學習算法針對每個單獨的特征和因變量建立預測模型。
Python代碼:
import numpy as np from sklearn.model_selection import KFold,cross_val_score,ShuffleSplit from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor#Load boston housing dataset as an example boston = load_boston() X = boston["data"] Y = boston["target"] names = boston["feature_names"]rf = RandomForestRegressor(n_estimators=20, max_depth=4) scores = [] for i in range(X.shape[1]):score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",cv=ShuffleSplit(len(X), 3, .3))scores.append((round(np.mean(score), 3), names[i])) print(sorted(scores, reverse=True))其中,RandomForestRegressor函數就是隨機森林回歸算法,從sklearn.ensemble庫中調用;函數為:
classsklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,max_features='auto', max_leaf_nodes=None, min_impurity_split=1e-07,bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0,warm_start=False, class_weight=None)- n_estimators:?也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數,默認是10。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合,一般選擇一個適中的數值。對Random Forest來說,增加“子模型數”(n_estimators)可以明顯降低整體模型的方差,且不會對子模型的偏差和方差有任何影響。模型的準確度會隨著“子模型數”的增加而提高,由于減少的是整體模型方差公式的第二項,故準確度的提高有一個上限。在實際應用中,可以以10為單位,考察取值范圍在1至201的調參情況。
- 對比,Random Forest的子模型都擁有較低的偏差,整體模型的訓練過程旨在降低方差,故其需要較少的子模型(n_estimators默認值為10)且子模型不為弱模型(max_depth的默認值為None);Gradient Tree Boosting的子模型都擁有較低的方差,整體模型的訓練過程旨在降低偏差,故其需要較多的子模型(n_estimators默認值為100)且子模型為弱模型(max_depth的默認值為3)。
此處參考https://blog.csdn.net/chaochaopang0/article/details/78604014
cross_val_score函數是做K折交叉驗證,函數體為: sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’) 參數:estimator: 需要使用交叉驗證的算法 X: 輸入樣本數據 y: 樣本標簽 groups: 將數據集分割為訓練/測試集時使用的樣本的組標簽(一般用不到) scoring: 交叉驗證最重要的就是他的驗證方式,選擇不同的評價方法,會產生不同的評價結果。具體如下:?ShuffleSplit函數是用來劃分數據集的,用于將樣本集合隨機“打散”后劃分為訓練集、測試集(可理解為驗證集,下同),類申明如下:
class sklearn.model_selection.ShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=None)- n_splits:int, 劃分訓練集、測試集的次數,默認為10
- test_size:float, int, None, default=0.1; 測試集比例或樣本數量,該值為[0.0, 1.0]內的浮點數時,表示測試集占總樣本的比例;該值為整型值時,表示具體的測試集樣本數量;train_size不設定具體數值時,該值取默認值0.1,train_size設定具體數值時,test_size取剩余部分
- train_size:float, int, None; 訓練集比例或樣本數量,該值為[0.0, 1.0]內的浮點數時,表示訓練集占總樣本的比例;該值為整型值時,表示具體的訓練集樣本數量;該值為None(默認值)時,訓練集取總體樣本除去測試集的部分
- random_state:int, RandomState instance or None;隨機種子值,默認為None
注意:
1. 樹的深度不要過大
2. 最好用交叉驗證
遞歸特征消除法
遞歸特征消除的主要思想是反復的構建模型(如SVM或者回歸模型)然后選出最好的(或者最差的)的特征(可以根據系數來選),把選出來的特征放到一遍,然后在剩余的特征上重復這個過程,直到所有特征都遍歷了。這個過程中特征被消除的次序就是特征的排序。因此,這是一種尋找最優特征子集的貪心算法。
RFE的穩定性很大程度上取決于在迭代的時候底層用哪種模型。例如,假如RFE采用的普通的回歸,沒有經過正則化的回歸是不穩定的,那么RFE就是不穩定的;假如采用的是Ridge,而用Ridge正則化的回歸是穩定的,那么RFE就是穩定的。
Sklearn提供了RFE包,可以用于特征消除,還提供了RFECV,可以通過交叉驗證來對的特征進行排序。
引用自https://mp.weixin.qq.com/s/8LMRVcxZsuJGXbj4AF-MIg
import numpy as np from sklearn.datasets import load_boston from sklearn.feature_selection import RFE from sklearn.linear_model import LinearRegressionboston = load_boston() X = boston["data"] Y = boston["target"] names = boston["feature_names"]#use linear regression as the model lr = LinearRegression() #rank all features, i.e continue the elimination until the last one rfe = RFE(lr, n_features_to_select=1) rfe.fit(X,Y)print("Features sorted by their rank:") print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names)))?穩定性選擇(Stability selection)
穩定性選擇是一種基于二次抽樣和選擇算法相結合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。它的主要思想是在不同的數據子集和特征子集上運行特征選擇算法,不斷的重復,最終匯總特征選擇結果,比如可以統計某個特征被認為是重要特征的頻率(被選為重要特征的次數除以它所在的子集被測試的次數)。理想情況下,重要特征的得分會接近100%。稍微弱一點的特征得分會是非0的數,而最無用的特征得分將會接近于0。
sklearn在隨機lasso和隨機邏輯回歸中有對穩定性選擇的實現。
from sklearn.linear_model import RandomizedLasso from sklearn.datasets import load_boston boston = load_boston()#using the Boston housing data. #Data gets scaled automatically by sklearn's implementation X = boston["data"] Y = boston["target"] names = boston["feature_names"]rlasso = RandomizedLasso(alpha=0.025) rlasso.fit(X, Y)print "Features sorted by their score:" print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), names), reverse=True)穩定性選擇對于克服過擬合和對數據理解來說都是有幫助的:總的來說,好的特征不會因為有相似的特征、關聯特征而得分為0。對于特征選擇任務,在許多數據集和環境下,穩定性選擇往往是性能最好的方法之一。
PS.?
1. 數據預處理:去掉變化較小的特征:
例如,某特征的特征值只有0和1,在所有輸入樣本中,95%的特征取值為1,認為該特征作用不大。此時應該去掉該特征。
參考資料:https://www.cnblogs.com/hhh5460/p/5186226.html
總結
以上是生活随笔為你收集整理的【Python】特征选择方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凸集 凸函数 凸优化
- 下一篇: 知识图谱相关了解