1. 程式人生 > >資料特徵選定

資料特徵選定

資料特徵選定

目的:最大限度地從原始資料中提取出合適的特徵。

單變數特徵選定

  • 統計分析可以用來分析和選擇對結果影響最大的資料特徵;
  • 可以選用一系列統計方法來選定資料特徵;
  • 卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,偏離程度決定了卡方值的大小;
  • 卡方值越大,越不符合
  • 卡方值越小,偏差越小,越趨於符合;
  • 若兩個值完全相等,卡方值就為 0,表示理論值完全符合。
# 通過卡方檢驗選定資料特徵

import numpy as np
import pandas as pd
from sklearn.feature_selection import
SelectKBest from sklearn.feature_selection import chi2 # 匯入資料 filename = 'pima_data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = pd.read_csv(filename, names=names) # 將資料分為輸入資料和輸出結果 array = data.values X = array[:, 0:8] Y = array[:, 8] # 特徵選定 test = SelectKBest(
score_func=chi2, k=4) fit = test.fit(X, Y) np.set_printoptions(precision=3) print(fit.scores_) features = fit.transform(X) print(features)

遞迴特徵消除(RFE)

  • RFE 使用一個基模型來進行多輪訓練,每輪訓練以後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練;
  • 通過每一個基礎模型的精度,找到對最終的預測結果影響最大的資料特徵;
# 通過遞迴消除來選定特徵
import pandas as pd
import numpy as
np from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression # 匯入資料 filename = 'pima_data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = pd.read_csv(filename, names=names) # 將資料分為輸入資料和輸出結果 array = data.values X = array[:, 0:8] Y = array[:, 8] # 特徵選定 model = LogisticRegression() rfe = RFE(model, 3) fit = rfe.fit(X, Y) print("特徵個數:") print(fit.n_features_) print("被選定的特徵:") print(fit.support_) for feature, selected in zip(names, fit.support_): if selected: print(feature) print("特徵排名:") # 被標記為 1 的特徵是被選定的特徵 print(fit.ranking_)

主成分分析

  • PCA 為了讓對映後的樣本具有最大的發散性,無監督降維
  • LDA 是為了讓對映後的樣本具有最好的分類效能,有監督降維
# 通過主要成分分析選定資料特徵
import pandas as pd
from sklearn.decomposition import PCA

# 匯入資料
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv(filename, names=names)
# 將資料分為輸入資料和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
# 特徵選定
pca = PCA(n_components=3)
fit = pca.fit(X)
print("解釋方差:%s" % fit.explained_variance_ratio_)
print(fit.components_)
print(fit.components_.shape)

特徵的重要性

  • 決策樹演算法、隨機森林演算法、極端隨機樹演算法都可以用來計算資料特徵的重要性。
# 通過決策樹計算特徵的重要性
import pandas as pd
from sklearn.ensemble import ExtraTreesClassifier

# 匯入資料
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv(filename, names=names)
# 將資料分為輸入資料和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
# 特徵選定
model = ExtraTreesClassifier()
fit = model.fit(X, Y)
print(fit.feature_importances_)

另外,線性迴歸以及正則化的線性迴歸(嶺迴歸、LASSO 迴歸)、邏輯迴歸都可以計算得到特徵的權重,通過權重的大小,也能反映特徵的重要性,特別地,LASSO 迴歸會讓一些特徵的權重變為 0。

參考資料:
1、使用 scikit-learn 進行特徵選擇
Read more: http://bluewhale.cc/2016-11-25/use-scikit-learn-for-feature-selection.html#ixzz5UMdz0779
說明:這篇文章中還介紹了使用方差的閾值進行特徵選擇的操作。