Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

逐次特徴選択

このトピックでは、逐次特徴選択の基本を説明し、カスタム基準と関数 sequentialfs を使用して逐次的に特徴量を選択する例を示します。

逐次特徴選択の紹介

一般的な特徴選択のメソッドは、"逐次特徴選択" です。このメソッドには 2 つの成分があります。

  • "基準" と呼ばれる目的関数。メソッドは、実行可能な特徴量サブセット全体から最小とするものを探索します。一般に用いられる基準は、平均二乗誤差 (回帰モデルの場合) と誤分類率 (分類モデルの場合) です。

  • 連続検索アルゴリズム。基準を評価しつつ、候補サブセットから特徴量を追加または削除します。n 特徴データセットのすべての 2n サブセットにおける基準値の徹底的な比較は一般的に実行不可能です (n のサイズと目的の呼び出しのコストにより異なります)。そのため、連続検索は 1 方向にのみ進み、候補セットは常に成長するか、常に縮小します。

メソッドには 2 つのバリアントがあります。

  • "逐次前方選択" ("SFS")。それ以上特徴量を追加しても基準が減少しなくなるまで、特徴量が空の候補セットに順次追加されます。

  • "逐次後方選択" ("SBS")。それ以上特徴量を削除すると基準が増加するようになるまで、特徴量が候補セット全体から順次削除されます。

Statistics and Machine Learning Toolbox™ には、逐次特徴選択の関数がいくつか用意されています。

  • ステップワイズ回帰は、特に最小二乗近似用に設計された逐次特徴選択手法です。関数 stepwiselmstepwiseglm は、最小二乗基準でのみ可能な最適化を利用します。その他の逐次特徴選択アルゴリズムと異なり、ステップワイズ回帰は、名前と値のペアの引数 'Criterion' によって指定された基準に基づいて、追加されていた特徴量を削除するか、削除されていた特徴量を追加することができます。

  • sequentialfs は、カスタム基準を使用して逐次特徴選択を実行します。入力引数には、予測子データ、応答データ、基準関数を実装するファイルに対する関数ハンドルなどがあります。データの特性または学習アルゴリズムのパフォーマンスを測定する基準関数を定義できます。オプションの入力により、SFS または SBS、必須または除外される特徴量、特徴量サブセットのサイズを指定できます。関数は cvpartitioncrossval を呼び出して、さまざまな候補セットで基準を評価します。

  • fscmrmr は、分類問題に対して Minimum Redundancy Maximum Relevance (MRMR) アルゴリズムを使用して特徴量をランク付けします。

比較予測力による特徴量のサブセットの選択

この例では、一般化線形回帰問題の予測力を測定するカスタム基準を使用して、特徴量のサブセットを選択します。

10 個の予測子の観測値が 100 個含まれているデータセットを考えてみましょう。予測子の値の各セットで二項分布応答を使用して、ロジスティック モデルから乱数データを生成します。一部の係数は 0 に設定されるので、すべての予測子が応答に影響を与えるわけではありません。

rng(456) % Set the seed for reproducibility
n = 100;
m = 10;
X = rand(n,m);
b = [1 0 0 2 .5 0 0 0.1 0 1];
Xb = X*b';
p = 1./(1+exp(-Xb));
N = 50;
y = binornd(N,p);

fitglm を使用して、ロジスティック モデルをデータにあてはめます。

Y = [y N*ones(size(y))];
model0 = fitglm(X,Y,'Distribution','binomial')
model0 = 
Generalized linear regression model:
    logit(y) ~ 1 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10
    Distribution = Binomial

Estimated Coefficients:
                   Estimate       SE        tStat        pValue  
                   _________    _______    ________    __________

    (Intercept)      0.22474    0.30043     0.74806       0.45443
    x1               0.68782    0.17207      3.9973     6.408e-05
    x2                0.2003    0.18087      1.1074       0.26811
    x3             -0.055328    0.18871    -0.29319       0.76937
    x4                2.2576     0.1813      12.452    1.3566e-35
    x5               0.54603    0.16836      3.2432     0.0011821
    x6              0.069701    0.17738     0.39294       0.69437
    x7              -0.22562    0.16957     -1.3306       0.18334
    x8              -0.19712    0.17317     -1.1383       0.25498
    x9              -0.20373    0.16796      -1.213       0.22514
    x10              0.99741    0.17247      5.7832    7.3296e-09


100 observations, 89 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 222, p-value = 4.92e-42

あてはめの逸脱度を表示します。

dev0 = model0.Deviance
dev0 = 101.5648

このモデルは、特徴量のすべてと初期定数項を使用する完全なモデルです。逐次特徴選択は、完全なモデルと同等の予測力をもつ特徴量サブセットを検索します。

特徴選択を実行する前に、特徴量を選択する基準を指定しなければなりません。このケースでは、基準はあてはめの逸脱度 (残差二乗和の汎化) です。関数 critfun (この例の終わりで現れます) は、fitglm を呼び出してあてはめの逸脱度を返します。

この例のライブ スクリプト ファイルを使用している場合、関数 critfun は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB パス上のファイルとして追加する必要があります。

特徴選択を実行します。sequentialfs は、関数ハンドルを介して基準関数を呼び出します。

maxdev = chi2inv(.95,1);     
opt = statset('display','iter',...
              'TolFun',maxdev,...
              'TolTypeFun','abs');

inmodel = sequentialfs(@critfun,X,Y,...
                       'cv','none',...
                       'nullmodel',true,...
                       'options',opt,...
                       'direction','forward');
Start forward sequential feature selection:
Initial columns included:  none
Columns that can not be included:  none
Step 1, used initial columns, criterion value 323.173
Step 2, added column 4, criterion value 184.794
Step 3, added column 10, criterion value 139.176
Step 4, added column 1, criterion value 119.222
Step 5, added column 5, criterion value 107.281
Final columns included:  1 4 5 10 

新しい特徴量がモデルに追加されるにつれ、反復表示は基準値の減少を示します。最終結果は、sequentialfs が返す logical ベクトル inmodel で示されているように、元の 10 個の特徴量のうち 4 つの特徴量 (X14510 列) のみが含まれている次元削減されたモデルです。

次元削減されたモデルの逸脱度は、完全なモデルの逸脱度より大きくなっています。しかし、他のいずれかの特徴量を 1 つ追加しても、オプション構造体で設定した絶対許容誤差 maxdev を上回って基準値が低下することはありません。影響のない特徴量の追加により、逸脱度は自由度 1 のカイ二乗分布をもつ量だけ減少します。有意な特徴量を追加すると、逸脱度がより大きく変化します。maxdevchi2inv(.95,1) に設定することにより、逸脱度の変化が偶然による変化より大きい場合は特徴量を追加し続けるよう sequentialfs に指示します。

初期定数項をもつ次元削減されたモデルを作成します。

model = fitglm(X(:,inmodel),Y,'Distribution','binomial')
model = 
Generalized linear regression model:
    logit(y) ~ 1 + x1 + x2 + x3 + x4
    Distribution = Binomial

Estimated Coefficients:
                    Estimate       SE         tStat        pValue  
                   __________    _______    _________    __________

    (Intercept)    -0.0052025    0.16772    -0.031018       0.97525
    x1                0.73814    0.16316       4.5241    6.0666e-06
    x2                 2.2139    0.17402       12.722    4.4369e-37
    x3                0.54073     0.1568       3.4485    0.00056361
    x4                 1.0694    0.15916       6.7191    1.8288e-11


100 observations, 95 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 216, p-value = 1.44e-45

次のコードは、関数 critfun を作成します。

function dev = critfun(X,Y)
model = fitglm(X,Y,'Distribution','binomial');
dev = model.Deviance;
end

参考

| |

関連するトピック