Scikit-Learnには、フォワード選択/段階的回帰アルゴリズムがありますか?

datascience.stackexchange https://datascience.stackexchange.com/questions/937

  •  16-10-2019
  •  | 
  •  

質問

私はあまりにも多くの機能で問題に取り組んでおり、モデルのトレーニングには時間がかかりすぎます。機能を選択するために、フォワード選択アルゴリズムを実装しました。

しかし、Scikit-Learnにはフォワード選択/段階的回帰アルゴリズムがあるのだろうと思いましたか?

役に立ちましたか?

解決

いいえ、Sklearnにはフォワード選択アルゴリズムがないようです。ただし、再帰機能の排除を提供します。これは、連続的な逆方向選択と同様の貪欲な特徴除去アルゴリズムです。ここでドキュメントを参照してください:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.rfe.html

他のヒント

SkeLeAnにはフォワード選択アルゴリズムがありますが、Scikit-Learnとは呼ばれていません。呼び出される機能選択方法 f_regression Scikit-Learnには、モデルを最も改善する機能が順番に含まれます。 K モデルの機能(kは入力)。

それは各機能のラベルを個別に回帰することから始まり、その機能を観察すると、F統計を使用してモデルを最も改善しました。次に、勝利機能をモデルに組み込みます。次に、残りの機能を繰り返して、モデルを最も改善する次の機能を見つけ、再びF統計またはFテストを使用します。モデルにK機能があるまでこれを行います。

モデルに組み込まれた機能と相関する残りの機能は、残差と相関していないため、おそらく選択されないことに注意してください(ただし、ラベルとよく相関する可能性があります)。これは、多重共線性を防ぐのに役立ちます。

Scikit-Learnは実際、段階的回帰をサポートしていません。これは、「段階的回帰」として一般的に知られているものは、線形回帰の係数のp値に基づくアルゴリズムであり、SCIKIT-LEARNはモデル学習(有意性テストなど)への推論的アプローチを意図的に回避するためです。さらに、純粋なOLSは多数の回帰アルゴリズムの1つにすぎず、Scikit-Learnの観点からは、それは非常に重要ではなく、最高のものでもありません。

ただし、線形モデルを使用して機能を選択するためにまだ良い方法が必要な人には、いくつかのアドバイスがあります。

  1. のような本質的にまばらなモデルを使用します ElasticNet また Lasso.
  2. 機能を正常化します StandardScaler, 、そして単に機能を注文します model.coef_. 。完全に独立した共変量の場合、それはp値によるソートと同等です。クラス sklearn.feature_selection.RFE あなたのためにそれをします、そして RFECV 最適な機能の数を評価します。
  3. 使用する 実装 調整された$ r^2 $によるフォワード選択の statsmodels.
  4. ブルートフォース前または後方の選択を行い、交差検証時にお気に入りのメトリックを最大化します(共変量の数で約2次時間がかかる可能性があります)。 scikit-learn互換性 mlxtend パッケージ サポート 推定器および任意のメトリックに対するこのアプローチ。
  5. それでもバニラが段階的に回帰したい場合は、それを基にする方が簡単です statsmodels, 、このパッケージはあなたのp値を計算するためです。基本的なフォワードバックワードの選択は、次のようになります。

```

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm

data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold_in=0.01, 
                       threshold_out = 0.05, 
                       verbose=True):
    """ Perform a forward-backward feature selection 
    based on p-value from statsmodels.api.OLS
    Arguments:
        X - pandas.DataFrame with candidate features
        y - list-like with the target
        initial_list - list of features to start with (column names of X)
        threshold_in - include a feature if its p-value < threshold_in
        threshold_out - exclude a feature if its p-value > threshold_out
        verbose - whether to print the sequence of inclusions and exclusions
    Returns: list of selected features 
    Always set threshold_in < threshold_out to avoid infinite looping.
    See https://en.wikipedia.org/wiki/Stepwise_regression for the details
    """
    included = list(initial_list)
    while True:
        changed=False
        # forward step
        excluded = list(set(X.columns)-set(included))
        new_pval = pd.Series(index=excluded)
        for new_column in excluded:
            model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
            new_pval[new_column] = model.pvalues[new_column]
        best_pval = new_pval.min()
        if best_pval < threshold_in:
            best_feature = new_pval.argmin()
            included.append(best_feature)
            changed=True
            if verbose:
                print('Add  {:30} with p-value {:.6}'.format(best_feature, best_pval))

        # backward step
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
        # use all coefs except intercept
        pvalues = model.pvalues.iloc[1:]
        worst_pval = pvalues.max() # null if pvalues is empty
        if worst_pval > threshold_out:
            changed=True
            worst_feature = pvalues.argmax()
            included.remove(worst_feature)
            if verbose:
                print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
        if not changed:
            break
    return included

result = stepwise_selection(X, y)

print('resulting features:')
print(result)

この例は、次の出力を印刷します。

Add  LSTAT                          with p-value 5.0811e-88
Add  RM                             with p-value 3.47226e-27
Add  PTRATIO                        with p-value 1.64466e-14
Add  DIS                            with p-value 1.66847e-05
Add  NOX                            with p-value 5.48815e-08
Add  CHAS                           with p-value 0.000265473
Add  B                              with p-value 0.000771946
Add  ZN                             with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']

実際、statsmodelsを使用し、独自のメトリック(AIC、BIC、Aducted-R-quared、または好きなもの)を設定してモデルに次第に追加できるようにする「Forward_Select」と呼ばれる素敵なアルゴリズムがあります。アルゴリズムは、このページのコメントセクションにあります - 下にスクロールすると、ページの下部近くに表示されます。

https://planspace.org/20150423-forward_selection_with_statsmodels/

アルゴリズムには1つの素晴らしい機能もあると付け加えます。分類または回帰の問題に適用できます。あなたはそれを言わなければなりません。

それを試して、自分のために見てください。

実際、sklearnにはフォワード選択アルゴリズムがありません。 リクエストをプルします 2017年4月以降、SCIKIT-LEARNリポジトリでは、フォワードフィーチャ選択の実装が待機されています。

別の方法として、フォワードとワンステップの後方の選択があります mlxtend. 。ドキュメントを見つけることができます シーケンシャル機能セレクター

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top