プログラミングと機械学習のメモ
日付: カテゴリ: SAS
以前PythonのLasso回帰をSASに置き換えるというタスクを任されたことがあり、 パラメータを指定して実行することが少し大変だったのでまとめました。
Lasso回帰は正則化された線形回帰で、過学習を抑えるために損失関数にL1ノルムを挿入します。
Lasso回帰は以下の関数を最小化することを目的とします。
ただし、$y_i$は目的変数、$\hat{y}_𝑖$は予測値、$\beta_𝑘$は偏回帰係数を表します。
Lasso回帰では$\lambda$を大きくすると、影響の少ない偏回帰係数がちょうど0になる性質を持つため、変数選択としても使用されます。
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;
主要なパラメータは以下の通りです。
ステートメントは以下の通りです。
その他、有用なオプションはいろいろあるので、こちらを参考にしてください。
結果は以下のようになりました。

たとえばnatbatのように偏回帰係数が表示されていない変数がありますが、これはLasso回帰によって0になり、変数が選択されなかったことを意味します。
最後に予測をします。
/*予測*/
data Pred;
set work.baseball_standard;
%include &filename.;
run;
codeステートメントで出力したコードを%includeすることにより、予測することができます。
Lasso回帰をSASで実行する方法を紹介しました。
今回はstepを1で指定しましたが、今後stepを複数回実行すると精度が向上するのかも検証していきたいです。