Shingoの数学ノート

プログラミングと機械学習のメモ

SASでパラメータを指定してLasso回帰を実装する

日付:    カテゴリ: SAS


以前PythonのLasso回帰をSASに置き換えるというタスクを任されたことがあり、 パラメータを指定して実行することが少し大変だったのでまとめました。

Lasso回帰とは

Lasso回帰は正則化された線形回帰で、過学習を抑えるために損失関数にL1ノルムを挿入します。

Lasso回帰は以下の関数を最小化することを目的とします。

\[ E = \sum_{𝑖=1}^𝑁(𝑦_𝑖−\hat{y}_𝑖)^2+\lambda\sum_{𝑘=1}^𝐾|\beta_𝑘| \]

ただし、$y_i$は目的変数、$\hat{y}_𝑖$は予測値、$\beta_𝑘$は偏回帰係数を表します。

Lasso回帰では$\lambda$を大きくすると、影響の少ない偏回帰係数がちょうど0になる性質を持つため、変数選択としても使用されます。

SASでLasso回帰

SASでLasso回帰を行うには、glmselectやhpgenselectなどを使用します。

デフォルトで使用すると最適な$\lambda$を自動で決定してくれます。 しかし今回は$\lambda$を指定したいのでhpgenselectでステップ数を1にします。

では、実際にLasso回帰を実行してみましょう。

まずはデータを作成し、標準化します

/*logSalaryの欠損データの除去*/
data work.baseball_standard;
  set sashelp.baseball;
  if logsalary then output;
run;
/*標準化*/
proc standard data = work.baseball_standard(keep = natbat--crbb logsalary)
    out = work.baseball_standard
    mean=0
    std = 1
    vardef=N;
  var  natbat--crbb;
run;

hpgenselectを使用してLasso回帰を実装します。

%let filename = "<Lasso回帰の予測コードを出力するパス>";
/*lasso回帰の実行*/
proc hpgenselect data=work.baseball_standard 
    lassorho=0.1 
    lassosteps=1 
    lassotol=0.0001 
    maxiter=1000
    outest;
  model logsalary = natbat--crbb;
  selection method=lasso;
  code file=&filename. residual;
  ods output ParameterEstimates=coef;
run;

主要なパラメータは以下の通りです。

  • lassorho
  • Lasso回帰の$\lambda$を指定します。ステップごとに変わるそうですが、今回は1stepのみ使用するのでそのまま値が使用されます。 lassorhoに関する詳しい記述はここ に書いてあります。
  • lassosteps
  • 繰り返し回数。今回は1を指定します。
  • lassotol
  • 収束基準
  • maxiter
  • イテレーション回数
  • outest
  • ParameterEstimatesを出力します。

ステートメントは以下の通りです。

  • model (目的変数)=(説明変数)
  • モデルの式を入力します。
  • selection method=lasso
  • lasso回帰で変数選択します。lassosteps=1を指定することで、PythonのLasso回帰と似た結果になります。
  • code file=
  • 予測結果を生成するプログラムコードを出力します
  • ods output
  • ParameterEstimatesをcoefという名前で出力します。

その他、有用なオプションはいろいろあるので、こちらを参考にしてください。

結果は以下のようになりました。

たとえばnatbatのように偏回帰係数が表示されていない変数がありますが、これはLasso回帰によって0になり、変数が選択されなかったことを意味します。

最後に予測をします。

/*予測*/
data Pred;
  set work.baseball_standard;
  %include &filename.;
run;

codeステートメントで出力したコードを%includeすることにより、予測することができます。

まとめ

Lasso回帰をSASで実行する方法を紹介しました。

今回はstepを1で指定しましたが、今後stepを複数回実行すると精度が向上するのかも検証していきたいです。


Comment Box is loading comments...