逐次特徴選択
このトピックでは、逐次特徴選択の基本を説明し、カスタム基準と関数 sequentialfs
を使用して逐次的に特徴量を選択する例を示します。
逐次特徴選択の紹介
一般的な特徴選択のメソッドは、"逐次特徴選択" です。このメソッドには 2 つの成分があります。
"基準" と呼ばれる目的関数。メソッドは、実行可能な特徴量サブセット全体から最小とするものを探索します。一般に用いられる基準は、平均二乗誤差 (回帰モデルの場合) と誤分類率 (分類モデルの場合) です。
連続検索アルゴリズム。基準を評価しつつ、候補サブセットから特徴量を追加または削除します。n 特徴データ セットのすべての 2n サブセットにおける基準値の徹底的な比較は一般的に実行不可能です (n のサイズと目的の呼び出しのコストにより異なります)。そのため、連続検索は 1 方向にのみ進み、候補セットは常に成長するか、常に縮小します。
メソッドには 2 つのバリアントがあります。
"逐次前方選択" ("SFS")。それ以上特徴量を追加しても基準が減少しなくなるまで、特徴量が空の候補セットに順次追加されます。
"逐次後方選択" ("SBS")。それ以上特徴量を削除すると基準が増加するようになるまで、特徴量が候補セット全体から順次削除されます。
Statistics and Machine Learning Toolbox™ には、逐次特徴選択の関数がいくつか用意されています。
ステップワイズ回帰は、特に最小二乗近似用に設計された逐次特徴選択手法です。関数
stepwiselm
とstepwiseglm
は、最小二乗基準でのみ可能な最適化を利用します。その他の逐次特徴選択アルゴリズムと異なり、ステップワイズ回帰は、名前と値のペアの引数'Criterion'
によって指定された基準に基づいて、追加されていた特徴量を削除するか、削除されていた特徴量を追加することができます。sequentialfs
は、カスタム基準を使用して逐次特徴選択を実行します。入力引数には、予測子データ、応答データ、基準関数を実装するファイルに対する関数ハンドルなどがあります。データの特性または学習アルゴリズムのパフォーマンスを測定する基準関数を定義できます。オプションの入力により、SFS または SBS、必須または除外される特徴量、特徴量サブセットのサイズを指定できます。関数はcvpartition
とcrossval
を呼び出して、さまざまな候補セットで基準を評価します。fscmrmr
とfsrmrmr
は、それぞれ分類問題と回帰問題に対して 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 つの特徴量 (X
の 1
、4
、5
、10
列) のみが含まれている次元削減されたモデルです。
次元削減されたモデルの逸脱度は、完全なモデルの逸脱度より大きくなっています。しかし、他のいずれかの特徴量を 1 つ追加しても、オプション構造体で設定した絶対許容誤差 maxdev
を上回って基準値が低下することはありません。影響のない特徴量の追加により、逸脱度は自由度 1 のカイ二乗分布をもつ量だけ減少します。有意な特徴量を追加すると、逸脱度がより大きく変化します。maxdev
を chi2inv(.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
参考
sequentialfs
| stepwiselm
| stepwiseglm