機械学習における特徴選択のいくつかの方法原理とコード実装(python)



一.特徴選択-単一変数特徴選択
1.SelectKBestは、相関に基づいて特徴を選択し、k個のスコアが最も高い特徴を保持することができる.
ぶんさんぶんせき
分類問題使用f_classif,回帰問題使用f_regression.
f_classif:分類タスク
ターゲットの分類とともに,サンプルをn個のサブセットに分割し,S 1,S 2,.,Sn,各サブセットの平均値を求めた.μ1,μ2,...,μnは等しくない.
H 0:μ1=μ2=...=μn,もちろんH 0を拒否することを望んでいるので,fが最大であればあるほどよいことを望んでいる.したがって,i番目の特徴xiにより分類を予測することができる.f値が大きいほど予測値が良い.
f_regression:タスクに戻る
参照:https://blog.csdn.net/jetFlow/article/details/78884619
f_を計算するにはregressionのff値は,まずi号特徴と因変数yとの間のサンプル相関係数を計算する.
我々が計算した ,こそf_regressionにおけるff値は,F(1,n−2)F(1,n−2)分布に従う.
ff値が大きいほど,i号特徴と因変数yとの相関が大きくなり,これに基づいて特徴選択を行う. 
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
from sklearn.datasets import load_iris
#     
data = load_iris()
slectKBest = SelectKBest(f_classif,k=2)
dataK = slectKBest.fit_transform(data.data,data.target)

2.学習モデルに基づくフィーチャーのソート
予測モデルは、個々の特徴および応答変数ごとに確立される.実はPearson相関係数は線形回帰における標準化回帰係数に等価である.ある特徴と応答変数との関係が非線形である場合、ツリーベースの方法(決定ツリー、ランダム森林)、または拡張された線形モデルなどを用いることができる.ツリーベースの方法は、非線形関係のモデリングが比較的良く、デバッグがあまり必要ないため、使いやすい.しかし、フィッティングの問題に注意する必要があります.そのため、ツリーの深さはあまり大きくないほうがいいです.ボストンの住宅価格データセットでsklearnを使用したランダムな森林回帰をクロス検証して、単一変数の選択の例を示します.
from sklearn.cross_validation import 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)

結果:
[(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]

二.再帰的特徴除去(RFE)
再帰的特徴除去(Recursive feature elimination)
再帰的特徴除去の主な考え方は,モデルの構築を繰り返し,最適(または最悪)の特徴(係数に基づいて選択)を選択し,選択した特徴を片側に置き,残りの特徴にこの過程を繰り返し,すべての特徴を遍歴するまで行った.この過程で除去される順序が特徴のソートである.
RFEの安定性は反復の場合,下層で用いられるどのモデルに大きく依存する.例えばRFEは通常の回帰(LR)を採用し,正規化されていない回帰は不安定であり,RFEは不安定である.Lasso/Ridgeを用い,正規化回帰が安定であれば,RFEは安定である.
次の例では、RFEおよびlogistic回帰アルゴリズムを使用して、最初の3つの特徴を選択する.アルゴリズムの選択は重要ではありません.熟練して一致する必要があります.
Import the required packages

Import pandas to read csv
Import numpy for array related operations

Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE

Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression

#URL for loading the dataset
url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data"
#Define the attribute names

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

#Create pandas data frame by loading the data from URL

dataframe = pandas.read_csv(url, names=names)

#Create array from data values
array = dataframe.values
#Split the data into input and target

X = array[:,:8]

Y = array[:,8]

#Feature extraction

model = LogisticRegression() 
rfe = RFE(model, 3)

fit = rfe.fit(X, Y)

print("Num Features: %d"% fit.n_features_) 
print("Selected Features: %s"% fit.support_)

print("Feature Ranking: %s"% fit.ranking_)

3.主成分分析
原理の参考:https://blog.csdn.net/program_developer/article/details/80632779
PCA pythonコード実装:
#Python  PCA
import numpy as np
def pca(X,k):#k is the components you want
  #mean of each feature
  n_samples, n_features = X.shape
  mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
  #normalization
  norm_X=X-mean
  #scatter matrix
  scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
  #Calculate the eigenvectors and eigenvalues
  eig_val, eig_vec = np.linalg.eig(scatter_matrix)
  eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
  # sort eig_vec based on eig_val from highest to lowest
  eig_pairs.sort(reverse=True)
  # select the top k eig_vec
  feature=np.array([ele[1] for ele in eig_pairs[:k]])
  #get new data
  data=np.dot(norm_X,np.transpose(feature))
  return data
 
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))

上のコードは,データXを特徴とする次元ダウンを実現している.結果は次のとおりです.
[[-0.50917706],[-2.40151069],[]-3.7751606],[1.20075534],[2.05572155],[3.42937146]]

2)sklearnのPCAで
## sklearn PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X)

関連ブログ:
Reference:
(1)主成分分析(PCA)原理の詳細
http://blog.csdn.net/zhongkelee/article/details/44064401
(2)機械学習のPCA主成分分析-steed-ブログ園
https://www.cnblogs.com/steed/p/7454329.html
(3)簡単で学びやすい機械学習アルゴリズム——主成分分析(PCA)
https://blog.csdn.net/google19890102/article/details/27969459
(4)機械学習実戦のPCA-バカ多学-ブログ園
https://www.cnblogs.com/zy230530/p/7074215.html
(5)機械学習における数学(5)−強力なマトリックス特異値分解(SVD)とその応用−LeftNotEasy−ブログパーク
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6)PCAとSVDの関係から拾う
https://blog.csdn.net/Dark_Scope/article/details/53150883
(7)CodingLabs-PCAの数学原理
http://blog.codinglabs.org/articles/pca-tutorial.html
(8)PCA(主成分分析)python実現
https://www.jianshu.com/p/4528aaa6dc48
(9)主成分分析PCA(Principal Component Analysis)のsklearnにおける応用及び一部ソース分析
https://www.cnblogs.com/lochan/p/7001907.html