並列化によるワイド データの正則化
この例は、観測より多くの予測子をもつモデルを正則化する方法を示しています。"ワイド データ" とは、観測より予測子が多いデータのことです。通常、ワイド データは重要な予測子を特定するために使用されます。lassoglm
を探索ツールまたは審査ツールとして使用して比較的少数の変数セットを選択し、モデル化および検索の優先順位を設定します。交差検証を高速化するために、並列計算を使用します。
ovariancancer
データを読み込みます。このデータの obs
ワークスペース変数に 216 の観測と 4,000 の予測子があります。応答は、'Cancer'
または 'Normal'
のバイナリで、grp
ワークスペース変数にあります。この応答を関数 lassoglm
で使用できるようにバイナリに変換します。
load ovariancancer y = strcmp(grp,'Cancer');
並列計算を使用するためにオプションを設定します。parpool
を使用して並列計算を準備します。
opt = statset('UseParallel',true);
parpool()
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). ans = ProcessPool with properties: Connected: true NumWorkers: 6 Cluster: local AttachedFiles: {} AutoAddClientPath: true IdleTimeout: 30 minutes (30 minutes remaining) SpmdEnabled: true
正則化したモデルの交差検証セットを当てはめます。グループの 1 つのメンバーを除くすべてを排除するのではなく、相関性の高い予測子のグループが維持されるように、Alpha
パラメーターを使用します。一般的に、比較的大きい Alpha
の値を使用します。
rng('default') % For reproducibility tic [B,S] = lassoglm(obs,y,'binomial','NumLambda',100, ... 'Alpha',0.9,'LambdaRatio',1e-4,'CV',10,'Options',opt); toc
Elapsed time is 90.892114 seconds.
交差検証プロットを調べます。
lassoPlot(B,S,'PlotType','CV'); legend('show') % Show legend
トレース プロットを調べます。
lassoPlot(B,S,'PlotType','Lambda','XScale','log')
右 (緑色) の縦の破線は、交差検証の逸脱度が最小になる Lambda
を示します。左 (青色) の破線は、最小逸脱度に標準偏差を 1 つだけ加算しています。この青い線にはより多くの予測子が含まれています。
[S.DF(S.Index1SE) S.DF(S.IndexMinDeviance)]
ans = 1×2
50 89
100 個の異なる Lambda
値を使用する当てはめを lassoglm
に要求しました。何個が使用されたでしょうか。
size(B)
ans = 1×2
4000 84
lassoglm
は 84 個の値を使用した後に停止しました。これは、小さい Lambda
値に対する逸脱度が小さすぎたためです。当てはめたモデルの逸脱度が二項反応の逸脱度に比べて小さすぎる場合、過適合を避けるために lassoglm
は停止し、予測子変数は無視されます。
名前と値のペアの引数 'Lambda'
を使用すると、lassoglm
で使用する項を強制的に増やすことができます。たとえば、S.Lambda
内の値より小さい値を 3 つ多く含む一連の Lambda
の値を定義します。
minLambda = min(S.Lambda); explicitLambda = [minLambda*[.1 .01 .001] S.Lambda];
関数 lassoglm
を呼び出すときに 'Lambda',explicitLambda
を指定します。一連の Lambda
の値を明示的に指定した場合でも、当てはめたモデルの逸脱度が小さすぎると lassoglm
は停止します。
時間を節約するには、次のようにします。
Lambda
の数、つまり近似の回数を減らす交差検証の分割数を減らす
LambdaRatio
の値を大きくする
逐次計算と次の 3 つすべての時間短縮メソッドを使用します。
tic [Bquick,Squick] = lassoglm(obs,y,'binomial','NumLambda',25,... 'LambdaRatio',1e-2,'CV',5); toc
Elapsed time is 16.517331 seconds.
新しい結果を最初の結果とグラフで比較します。
lassoPlot(Bquick,Squick,'PlotType','CV'); legend('show') % Show legend
lassoPlot(Bquick,Squick,'PlotType','Lambda','XScale','log')
最小値で非ゼロの係数の数に 1 つの標準偏差モデルを加えると、最初の計算と同じく約 50 になります。