scikit-learnには前方選択/段階的回帰アルゴリズムがありますか?


37

私は機能が多すぎるという問題に取り組んでおり、モデルのトレーニングに時間がかかりすぎています。機能を選択するために前方選択アルゴリズムを実装しました。

しかし、私はscikit-learnに前方選択/段階的回帰アルゴリズムがあるのだろうかと思っていましたか?


私はそのために独自のクラスを作成しましたが、sklearnにそれがないことに非常に驚きました。
マクスード

1
仮説検定の使用は、特徴選択のひどい方法です。あなたはそれらの多くを行う必要があります、そしてもちろん、あなたは多くの偽陽性と陰性を得るでしょう。
リカルドクルーズ

回答:


21

いいえ、sklearnには前方選択アルゴリズムはないようです。ただし、再帰的特徴除去を提供します。これは、順次後方選択に似た貪欲な特徴除去アルゴリズムです。こちらのドキュメントをご覧ください。

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


3
良い提案ですが、Sci-Kit実装の問題は、モデルのcoef_インターフェースによって特徴の重要性がモデル係数によって定量化されることです。これはツリーベースの方法などを除外します。しかし、@ Maksudが求めたのは、Jamesによる「統計学習入門」で説明されているものです。 。これにより、単なる線形パラメトリックモデルではなく、すべてのタイプのモデルでフィーチャを選択できます。
eggie5

9

Sklearnには前方選択アルゴリズムがありますが、scikit-learnではそうではありません。scikit-learnのF_regressionと呼ばれる機能選択方法にKは、モデルに機能が追加されるまで(Kは入力)、モデルを最も改善する機能が順次含まれます。

各特徴のラベルを個別に回帰分析し、次にF統計を使用してどの特徴がモデルを最も改善したかを観察します。次に、勝った機能をモデルに組み込みます。次に、残りの機能を反復処理して、F統計またはF検定を使用して、モデルを最も改善する次の機能を見つけます。これは、モデルにK個の特徴があるまでこれを行います。

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



1
Select K-bestを意味しますか?
ニトロ

はい。また、これを読む必要があります:stats.stackexchange.com/questions/204141/…
-Candic3

2
それは一種の前方選択です。しかし、一般的ではありません-これは線形回帰モデルに固有のものですが、通常、前方選択はRFEと同様に任意のモデル(モデルに依存しない)で機能し、分類または回帰の問題を処理できます。しかし、私はほとんどの人がこのユースケースを探していると思うので、ここで言及するのは確かに良いことです。
サイモン

2
各p値は他のすべての共変量とは無関係に単変量回帰に対して計算されるため、これはSTEPWISE選択ではありません。
デビッドデール

9

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

ただし、線形モデルを使用して特徴を選択するための優れた方法を引き続き必要とする人には、いくつかのアドバイスがあります。

  1. ElasticNetまたはのような本質的に疎なモデルを使用しLassoます。
  2. で機能を正規化し、で機能をStandardScaler注文しますmodel.coef_。完全に独立した共変量の場合、p値によるソートと同等です。クラスsklearn.feature_selection.RFEはあなたのためにそれを行いRFECV、機能の最適な数を評価します。
  3. R2statsmodels
  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']

投稿されたフォワードステップワイズ回帰コードは正しく機能しません。後方段階的回帰に同じ結果を与えるはずですが、そうではありません。回帰を再実行すると、しきい値よりも高いp値を持つ因子が返されます。また、同じデータセットをSTATAで実行し、同じしきい値を逆方向に段階的に使用して、実質的に異なる結果を取得しました。基本的に、それを使用しないでください。彼のテンプレートを使用して、独自の後方段階的回帰コードを作成します。
マイケルコーリーMBA LSSBB

順方向および逆方向の段階的回帰は、同じ解に収束することを保証するものではありません。また、私のソリューションにバグがあることに気付いた場合は、コードを添付して再現してください。
デビッドデール

1

実際、Statsmodelsを使用し、独自のメトリック(AIC、BIC、Adjusted-R-Squaredなど)を設定して変数をモデルに徐々に追加できる「Forward_Select」と呼ばれる素晴らしいアルゴリズムがあります。アルゴリズムは、このページのコメントセクションにあります。スクロールダウンすると、ページの下部近くに表示されます。

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

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

試してみて、自分の目で確かめてください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.