【翻訳】scikit-learn 0.18 User Guide 1.13 特徴選択

http://scikit-learn.org/0.18/modules/feature_selection.html を google翻訳した
[scikit-learn 0.18 ユーザーガイド 1. 教師付き学習](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98%E3%81%8D%E5%AD%A6%E7%BF%92) より

----
# 1.13. 特徴量の選択

[sklearn.feature_selection](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection)モジュールのクラスを使用すると、推定器の精度スコアを向上させたり、非常に高次元のデータセットでのパフォーマンスを向上させたりするために、サンプルセットのフィーチャ選択/次元削減に使用できます。

## 1.13.1. 分散の少ない特徴量の削除

[VarianceThreshold](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html#sklearn.feature_selection.VarianceThreshold) は、特徴量選択に対する簡単なベースラインアプローチです。分散があるしきい値を満たさないすべての特徴量を削除します。デフォルトでは、すべてのゼロ分散特徴量、つまりすべてのサンプルで同じ値を持つ特徴量が削除されます。
たとえば、ブール値の特徴量を持つデータセットがあり、サンプルの80％以上で1またはゼロ（オンまたはオフ）のフィーチャをすべて削除したいとします。ブール関数はベルヌーイの確率変数であり、このような変数の分散は

```math
\mathrm {Var} [X] = p（1-p）
```

したがって、しきい値 `.8 * (1 - .8)` を使用して選択することができます。

```
>>>
>>> sklearn.feature_selectionからのインポートVarianceThreshold
>>> X = [[0,0,1]、[0,1,0]、[1,0,0]、[0,1,1]、[0,1,0]、[0,1 、1]]
>>> sel = VarianceThreshold（しきい値=（.8 *（1~8）））
>>> sel.fit_transform（X）
配列（[[0、1]、
       [1、0]、
       [0、0]、
       [1,1]
       [1、0]、
       [1,1]））
```

予想通り、VarianceThresholdは最初の列を削除しました。この列はゼロを含む確率 $p = 5/6> .8$ です。

## 1.13.2. 単変量特徴量機能の選択

単変量特徴量の選択は、単変量統計テストに基づいて最適な特徴量を選択することによって機能します。これは、推定器の前処理ステップとして見ることができます。 Scikit-learnは、変換メソッドを実装するオブジェクトとして特徴量選択ルーチンを公開します。

 - [SelectKBest](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html#sklearn.feature_selection.SelectKBest)は、 $k$ 個の最高スコア特徴量以外のすべてを削除します
 - [SelectPercentile](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html#sklearn.feature_selection.SelectPercentile)は、ユーザーが指定した最もスコアの割合の高い特徴量を削除します
 - 各特徴量に対して共通の単変量統計テストを使用します。偽陽性率[SelectFpr](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFpr.html#sklearn.feature_selection.SelectFpr)、偽発見率[SelectFdr](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFdr.html#sklearn.feature_selection.SelectFdr)、またはファミリーワイズエラー[SelectFwe](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFwe.html#sklearn.feature_selection.SelectFwe)。
 - [GenericUnivariateSelect](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.GenericUnivariateSelect.html#sklearn.feature_selection.GenericUnivariateSelect)を使用すると、構成可能な戦略で単変量特徴量の選択を実行できます。これは、ハイパーパラメータ探索推定器を用いて最良の一変量選択戦略を選択することを可能にする。
 - 
たとえば、サンプルに対して $\chi ^ 2$ テストを実行して、次のように2つのベストフィーチャのみを取得できます。

```py
>>>
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
```

これらのオブジェクトは、単変量のスコアとp値（またはSelectKBestとSelectPercentileのスコアのみ）を返すスコアリング関数を入力として受け取ります。

 - 回帰の場合：[f_regression](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html#sklearn.feature_selection.f_regression)、[mutual_info_regression](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_regression.html#sklearn.feature_selection.mutual_info_regression)
 - 分類の場合：[chi2](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html#sklearn.feature_selection.chi2)、[f_classif](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_classif.html#sklearn.feature_selection.f_classif)、[mutual_info_classif](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_classif.html#sklearn.feature_selection.mutual_info_classif)

F検定に基づくメソッド(f_)は、2つの確率変数間の線形依存度を推定する。一方、相互情報(mutual_info_)メソッドは、あらゆる種類の統計的依存性を捕捉することができるが、ノンパラメトリックであるため、正確な推定のためにより多くのサンプルが必要となる。

 - 疎なデータによる特徴選択
    - 疎なデータ（すなわち、疎行列として表されるデータ）を使用する場合、chi2、mutual_info_regression、mutual_info_classifはデータを密にすることなく処理します。
 - 警告: 分類問題で回帰スコア関数を使用しないように注意してください。無駄な結果になります。
 - 例：
   - [一変量機能の選択](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_feature_selection.html#sphx-glr-auto-examples-feature-selection-plot-feature-selection-py)
   - [F検定と相互情報の比較](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_f_test_vs_mi.html#sphx-glr-auto-examples-feature-selection-plot-f-test-vs-mi-py)


## 1.13.3. 再帰的な特徴の除去

特徴（例えば、線形モデルの係数）に重みを割り当てる外部推定器が与えられたとき、再帰的特徴除去（[RFE](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html#sklearn.feature_selection.RFE)）とは、より小さい特徴集合を再帰的に考慮して特徴を選択することである。最初に、推定器は初期の特徴集合に対して訓練され、重みはそれぞれの特徴点に割り当てられる。次に、絶対重みが最も小さい特徴量が、現在の特徴量セットから刈り落とされます。その手続きは、選択する必要な特徴量の数が最終的に達するまで、刈り落とされたセットに対して再帰的に繰り返されます。
[RFECV](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html#sklearn.feature_selection.RFECV)は相互検証ループでRFEを実行し、最適な数の特徴を見つけます。

 - 例：
   - [再帰的特徴除去](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_digits.html#sphx-glr-auto-examples-feature-selection-plot-rfe-digits-py)：再帰的特徴除去の例で、桁分類タスクにおける画素の関連性を示す。
   - [クロスバリデーションによる再帰的な特徴の除去](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html#sphx-glr-auto-examples-feature-selection-plot-rfe-with-cross-validation-py)：クロスバリデーションで選択された特徴の数の自動チューニングによる再帰的な特徴の除去の例。

## 1.13.4. SelectFromModelを使用した機能の選択

[SelectFromModel](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html#sklearn.feature_selection.SelectFromModel)は、フィッティング後に `coef_` または`feature_importances_`属性を持つ推定器と一緒に使用できるメタ変換器です。 `coef_`または`feature_importances_`の対応する値が、指定されたしきい値パラメータを下回る場合、特徴は重要ではないとみなされ、削除されます。しきい値を数値で指定する以外にも、文字列引数を使用してしきい値を見つけるためのヒューリスティックスが組み込まれています。利用可能なヒューリスティックスは、「平均」、「中央値」、およびこれらの浮動小数点数の「0.1 *平均」です。
使用方法の例については、以下のセクションを参照してください。

 - 例：
   - [SelectFromModelとLassoCVを使用した特徴選択](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_select_from_model_boston.html#sphx-glr-auto-examples-feature-selection-plot-select-from-model-boston-py)：事前にしきい値を知らずにボストンのデータセットから2つの最も重要な特徴を選択します。

### 1.13.4.1. L1ベースの特徴選択

L1ノルムでペナルティを課された[線形モデル](http://scikit-learn.org/stable/modules/linear_model.html#linear-model)には疎な解があります。推定係数の多くはゼロです。他の分類器で使用するデータの次元を減らすことが目標である場合、[feature_selection.SelectFromModel](http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html#sklearn.feature_selection.SelectFromModel)と一緒に使用して非ゼロ係数を選択することができます。特に、この目的に有用な疎判定器は、回帰のための[linear_model.Lasso](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html#sklearn.linear_model.Lasso)と、分類のための[linear_model.LogisticRegression](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression)および[svm.LinearSVC](http://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC)である。

```py
>>>
>>> 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
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)
```

SVMとロジスティック回帰では、パラメータCはスパース性を制御します。Lassoでは、アルファパラメータが高いほど選択される特徴量が少なくなります。

- 例：
  - [スパース特徴を用いたテキスト文書の分類](http://scikit-learn.org/stable/auto_examples/text/document_classification_20newsgroups.html#sphx-glr-auto-examples-text-document-classification-20newsgroups-py)：L1ベースの特徴選択を含む文書分類のための異なるアルゴリズムの比較。

##### L1回復と圧縮センシング

アルファの良い選択のために、[Lasso](http://scikit-learn.org/stable/modules/linear_model.html#lasso)は特定の条件が満たされれば、ほんの僅かな観察だけで正確な非ゼロ変数のセットを完全に回復することができます。特に、サンプル数が「十分に大きい」、またはL1モデルがランダムに実行される必要があります。 「十分に大きい」は、非ゼロ係数の数、特徴の数の対数、ノイズの量、非ゼロ係数の絶対値の最小値、および行列Xの構造に依存する。さらに、 デザインマトリックスは、あまりにも相関がないなど、特定の特定のプロパティを表示する必要があります。さらに、設計行列は、あまりにも相関しないなどの特定の特性を表示しなければならない。
非ゼロ係数の回復のためのアルファパラメータを選択する一般的なルールはない。これは、クロスバリデーション（LassoCVまたはLassoLarsCV）によって設定することができますが、これは、過小評価されたモデルにつながる可能性があります：少数の関連性のない変数を含むことは予測スコアに有害ではありません。 BIC（LassoLarsIC）は逆にαの高い値を設定する傾向があります。

 - 参考文献
    - Richard G. Baraniuk「圧縮センシング」、IEEE Signal Processing Magazine [120] 2007年7月
http://dsp.rice.edu/sites/dsp.rice.edu/files/cs/baraniukCSlecture07.pdf

### 1.13.4.2. ランダム化スパースモデル

特徴の選択に関して、回帰および分類のためのL1罰則モデルのいくつかの周知の限界がある。例えば、Lassoは、相関の高い特徴のグループの中から個々の変数を選択する傾向があることが知られている。さらに、特徴間の相関が高すぎない場合でも、L1罰則方法が一貫して「良い」特徴を選択する条件は、一般的に制限的であり得る。
この問題を軽減するために、[B2009]と[M2010]に示されているようなランダム化手法を使用することが可能です。後者の手法は、安定性選択と呼ばれ、[sklearn.linear_model](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.linear_model)モジュールで実装されています。安定性選択方法では、データのサブサンプルは、係数のランダムサブセットのペナルティがスケーリングされたL1ペナルティモデルに適合される。具体的には、データ $ (x_i, y_i), i \in I$ のサブサンプルが与えられ、ここで、 $I \subset \{1, 2, \ldots, n\}$ は、サイズ $n_I$ のデータのランダムなサブセットであり、以下の修正されたLassoフィットが得られる：

```math
\hat{w_I} = \mathrm{arg}\min_{w} \frac{1}{2n_I} \sum_{i \in I} (y_i - x_i^T w)^2 + \alpha \sum_{j=1}^p \frac{ \vert w_j \vert}{s_j},
```

$s_j \in \{s、1 \}$ は公平なベルヌーイ確率変数の独立した試行であり、$0 <s <1$はスケーリング係数である。この手順を異なるランダムサブサンプルおよびベルヌーイ試行にわたって繰り返すことにより、ランダム化された手順が各特徴を選択した回数を数え、これらの割合を特徴選択のスコアとして使用することができる。
[RandomizedLasso](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RandomizedLasso.html#sklearn.linear_model.RandomizedLasso)はLassoを使用して回帰設定にこの戦略を実装し、[RandomizedLogisticRegression](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RandomizedLogisticRegression.html#sklearn.linear_model.RandomizedLogisticRegression)はロジスティック回帰を使用し、分類タスクに適しています。安定性スコアの完全なパスを得るには、[lasso_stability_path](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.lasso_stability_path.html#sklearn.linear_model.lasso_stability_path)を使用します。

![../_images/sphx_glr_plot_sparse_recovery_0031.png](http://scikit-learn.org/stable/_images/sphx_glr_plot_sparse_recovery_0031.png)
http://scikit-learn.org/stable/auto_examples/linear_model/plot_sparse_recovery.html

非ゼロ特徴を検出する際にランダム化されたスパースモデルが標準F統計よりも強力であるためには、グランドトゥルースモデルが疎でなければならない、換言すれば、ゼロ以外の特徴のほんの一部しか存在しないはずである。

 - 例：
    - [スパースリカバリ：スパース線形モデルのためのフィーチャ選択](http://scikit-learn.org/stable/auto_examples/linear_model/plot_sparse_recovery.html#sphx-glr-auto-examples-linear-model-plot-sparse-recovery-py)：異なるフィーチャ選択アプローチを比較し、各アプローチがどのような状況で好まれるかを議論する例。
 - 参考文献：
   - [B2009] F. Bach、「ブートストラップによるモデル一貫性のあるスパース推定」https://hal.inria.fr/hal-00354771/
   - [M2010] N. Meinshausen、P. Buhlmann、 "安定性の選択"、ロイヤル統計学会、72（2010）http://arxiv.org/pdf/0809.2932.pdf

### 1.13.4.3. ツリーベースの機能選択

ツリーベースの推定機（sklearn.treeモジュールとsklearn.ensembleモジュールのツリーのフォレストを参照）を使用して特徴の読み込みを計算し、関連のない特徴を破棄することができます（sklearn.feature_selection.SelectFromModelメタ変換器と結合すると）

```py
>>>
>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_ 
array([ 0.04..., 0.05..., 0.4..., 0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape 
(150, 2)
```

- 例：
    - [樹木の森林での機能の重要性](http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html#sphx-glr-auto-examples-ensemble-plot-forest-importances-py)：実際に意味のある機能の回復を示す合成データの例
    - [木の平行な森林を持つピクセルの重要性](http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances_faces.html#sphx-glr-auto-examples-ensemble-plot-forest-importances-faces-py)：顔認識データの例

## 1.13.5. パイプラインの一部としての機能の選択

特徴選択は、通常、実際の学習を行う前に前処理ステップとして使用されます。 scikit-learnでこれを行うには、sklearn.pipeline.Pipelineを使用することをお勧めします。

```py
clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)
```

このスニペットでは、sklearn.svm.LinearSVCとsklearn.feature_selection.SelectFromModelを組み合わせて、特徴量の重要性を評価し、最も関連性の高い特徴量を選択します。次に、sklearn.ensemble.RandomForestClassifierは、変換された出力に対して、すなわち関連する特徴量のみを使用して訓練される。同様の操作は、他の特徴量選択メソッドと、もちろん、特徴量の重要性を評価する方法を提供する分類器でも実行できます。詳細については、sklearn.pipeline.Pipelineの例を参照してください。

----
[scikit-learn 0.18 ユーザーガイド 1. 教師付き学習](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98%E3%81%8D%E5%AD%A6%E7%BF%92) より

©2010 - 2016、scikit-learn developers（BSDライセンス）