Main Content

並列化によるワイド データの正則化

この例は、観測より多くの予測子をもつモデルを正則化する方法を示しています。"ワイド データ" とは、観測より予測子が多いデータのことです。通常、ワイド データは重要な予測子を特定するために使用されます。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 になります。