scikit-learn中提供了用於特徵選擇的模塊feature_selection,主要方法包括方差移除法,卡方檢驗法,基於L1的特徵選擇和基於樹的特徵選擇。
開始前的準備工作
首先導入所需的庫文件,這裡只導入numpy和pandas,後面在過程中會陸續導入所需的庫文件。
#導入所需的庫文件
import numpy as np
import pandas as pd
#讀取並設置數據表
data=pd.DataFrame(pd.read_excel('fs.xlsx'))
#設置特徵和目標
X = np.array(data[['loan_amnt', 'funded_amnt_inv', 'installment', 'annual_inc', 'dti','inq_last_6mths', 'open_acc', 'revol_bal', 'revol_util', 'total_acc','total_pymnt', 'total_rec_prncp', 'total_rec_int']])
y = np.array(data['loan_status'])
特徵數據標準化
導入數據預處理庫對特徵進行標準化處理。
#導入數據預處理庫
from sklearn import preprocessing
#範圍0-1縮放標準化
min_max_scaler = preprocessing.MinMaxScaler()
X_scaler=min_max_scaler.fit_transform(X)
#查看特徵的維度
X_scaler.shape
(27, 13)
原始特徵的維度為27行,13列。
移除方差較低的特徵
導入特徵選擇庫中的VarianceThreshold用於通過方差選擇特徵。方差為0的特徵會被自動移除。剩下的特徵按設定的方差的閾值進行選擇。
#導入sklearn庫中的VarianceThreshold
from sklearn.feature_selection import VarianceThreshold
#設置方差的閾值為0.8
sel = VarianceThreshold(threshold=.08)
#選擇方差大於0.8的特徵
X_sel=sel.fit_transform(X_scaler)
X_sel.shape
(27, 5)
單變量特徵選擇-卡方檢驗
導入特徵選擇庫中的SelectKBest和chi2用來計算特徵與結果間的相關性,並選擇相關性最高的特徵。
#導入sklearn庫中的SelectKBest和chi2
from sklearn.feature_selection import SelectKBest ,chi2
#選擇相關性最高的前5個特徵
X_chi2 = SelectKBest(chi2, k=5).fit_transform(X, y)
X_chi2.shape
(27, 5)
基於L1的特徵選擇
導入LinearSVC和特徵選擇庫中的SelectFromModel,基於L1進行特徵選擇。
#導入sklearn庫中的LinearSVC和SelectFromModel
from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel
#基於L1的LinearSVC選擇特徵
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X_scaler, y)
model = SelectFromModel(lsvc, prefit=True)
X_lsvc = model.transform(X_scaler)
X_lsvc.shape
(27, 0)
基於樹的特徵選擇
導入SelectFromModel結合ExtraTreesClassifier計算特徵重要性,並按重要性閾值選擇特徵。
#導入sklearn的ExtraTreesClassifier和SelectFromModel
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel
#基於樹模型進行模型選擇
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
#特徵重要性(數值越高特徵越重要)
clf.feature_importances_
array([ 0.09125597, 0.08141056, 0.04023573, 0.06036499, 0.05710406,
0.04654329, 0.00897838, 0.07429618, 0.09712373, 0.07771509,
0.18477631, 0.10875497, 0.07144073])
#選擇特徵重要性為1.25倍均值的特徵
model = SelectFromModel(clf, threshold='1.25*mean',prefit=True)
#返回所選的特徵
X_trees = model.transform(X)
X_trees.shape
(27, 6)
END