SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ITエンジニアのためのスパースモデリング入門

最先端のスパースモデリング~HMLassoとPliable Lasso~

ITエンジニアのためのスパースモデリング入門 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

新しい「LASSO」たち(2)

状況によって回帰係数を変えられる「Pliable Lasso」

 もう一つ、新しいLassoのアルゴリズムを紹介しましょう。

 Lassoを代表とするような回帰分析においては、

\( \hat{y} = \sum_{j = 1}^p X_j \hat{\beta}_j \)

というように、各説明変数\(X_j\)に対する回帰係数\(\hat{\beta}_j\)を推定していました。

 一方、現実の問題では、この回帰係数を状況によって変えたいという要望が存在します。例えば以下のような場合です。

 「ある薬は、男性にはよく効くが、女性にはあまり効かない」

 数学的に言い換えれば、この薬を表す説明変数を\(X_j\)とすると、\(X_j\)に対する回帰係数\(\hat{\beta}_j\)を、男性に投与するときは大きく、女性に投与するときは小さく推定したいということになります。

 これを可能にするアルゴリズムが、Lassoの開発者であるRobert Tibshirani教授によって開発された「Pliable Lasso」です[2]

[2] Tibshirani, Robert, and Jerome Friedman. "A pliable lasso." Journal of Computational and Graphical Statistics 29.1 (2020): 215-225.

 Pliable Lassoでは、説明変数\(X\)の他に、修正変数\(Z\)という変数を導入します。\(Z\)は先程の例でいう性別などを表す変数です。

 そして、回帰モデルを

\( \hat{y} = \sum_{j = 1}^p X_j \circ (\hat{\beta}_j \mathbf{1} + Z \hat{\theta}_j) \)

と考えます。ただし、\(\mathbf{1}\)は\(1\)を縦に\(p\)個並べたベクトル、\(\circ\)はベクトルの要素ごとの積を表します。

 このモデルは、修正変数\(Z\)の値によって、説明変数\(X_j\)にかかる回帰係数の値が変化するということを表しています。

 Pliable Lassoでは、上のモデルに、さらに「\(\hat{\beta}_j = 0\)のときは、\(\hat{\theta}_j = 0\)である」という階層制約を加え、修正変数\(Z\)が単体で入力\(y\)の主要因になってしまうことを防ぎます。

 このような回帰係数\(\beta\)および\(\theta\)は、次の関数を最小化することにより推定することができます。

\( J(\beta, \theta) = \frac{1}{2} \| y - \hat{y} \|_2^2 + (1 - \alpha) \lambda \sum_{j = 1}^p (\| (\beta_j, \theta_j)\|_2^2 + \|\theta_j\|_2^2) + \alpha \lambda \sum_{j, k} |\theta_{jk}| \)

 ここで、第2項は先程の階層制約を表していて、第3はの回帰係数\(\hat{\theta}\)のスパース性を表しています。

 それでは、実際に、Pliable Lassoをプログラムで動かしてみましょう。まず、Pliable Lassoのパッケージpliableをインストールします。

# Install package for Pliable Lasso
if(!require("pliable")){
    url <- "https://cran.r-project.org/src/contrib/Archive/pliable/pliable_1.1.tar.gz"
    pkgFile <- "pliable_1.1.tar.gz"
    download.file(url = url, destfile = pkgFile)
    install.packages(pkgs=pkgFile, type="source", repos=NULL)
    unlink(pkgFile)
}

 今回は、各要素を正規分布でランダムに初期化した行列\(X\)と、各要素を\(0\)または\(1\)でランダムに初期化した行列\(Z\)を用いて、\(y\)を

\( y = 2 X_1 - 2 X_2 + (2 + 2 Z_1) X_3 + (2 - 4 Z_2) X_4 + 0.5 \varepsilon \)

と生成したデータを用います。ただし、\(\varepsilon\)は標準正規分布に従うノイズとします。

 このデータを使ってCross Validationを用いたPliable Lassoで回帰係数の推定を行ってみます。

fit_pliable <- pliable(x, z, y)
cv_fit_pliable <- cv.pliable(fit_pliable, x, z, y, verbose=FALSE)
fit_pliable <- pliable(x, z, y, lambda=cv_fit_pliable$lambda.min)
print(coef(fit_pliable))
# $betaz
# [1]  0.01100791 -0.06641263  0.10949380  0.03993577
#
# $beta
#  [1]  1.96552143 -2.01533988  1.95736209  1.88119097 -0.08082027 -0.03948929
#  [7]  0.00000000 -0.07799262 -0.02051081 -0.02314566
#
# $theta
#               [,1]         [,2]         [,3]         [,4]
#  [1,]  0.087065566 -0.000131529  0.000000000 -0.041261783
#  [2,]  0.000000000  0.000000000  0.000000000  0.000000000
#  [3,]  1.941422377 -0.034798144  0.000000000 -0.002797550
#  [4,] -0.005704073 -3.955412349  0.000000000  0.026515585
#  [5,] -0.031601711  0.000000000  0.069946806 -0.076491350
#  [6,] -0.007395559  0.000000000  0.000000000  0.004435835
#  [7,]  0.000000000  0.000000000  0.000000000  0.000000000
#  [8,]  0.000000000 -0.031844665  0.058509824  0.000000000
#  [9,]  0.009148531  0.000000000 -0.006090111 -0.001607628
# [10,]  0.000000000  0.016534991 -0.006355646  0.000000000)

 出力結果と、上で\(y\)を生成した式を見比べてみると、回帰係数\(\hat{\beta}\)および\(\hat{\theta}\)の値がほぼ正しく推定できていることがわかります。

 また、詳しい読者の方ならお気づきかもしれませんが、Pliable Lassoと似たモデルとして、交互作用モデルというものがあります。

 これは、2種類の説明変数\(X\)と\(Z\)の組み合わせで表されるような要因が考えられる際に、両者をかけ合わせた交互作用項\(XZ\)を新たに説明変数に加えるようなモデルのことを指します。

 実は、Pliable Lassoのモデルの式の

\( \hat{y} = \sum_{j = 1}^p X_j \circ (\hat{\beta}_j \mathbf{1} + Z \hat{\theta}_j) \)

は、次のように変形することで、\(X\)と\(Z\)の交互作用として表すことができます。

\( \hat{y} = X \hat{\beta} + \sum_{j = 1}^p (X_j \circ Z) \hat{\theta}_j \)

 つまり、Pliable Lassoは、2種類の説明変数\(X\)と\(Z\)の交互作用を考慮した交互作用モデルに「\(\hat{\beta}_j = 0\)のときは、\(\hat{\theta}_j = 0\)である」という階層制約を加えたモデルと言えます。

 そうすることにより、「\(Z\)の値によって、\(X_j\)にかかる回帰係数の値を修正する」という、交互作用モデルよりもより解釈性の高いモデルを実現しているのです。

最後に

 本連載では、データ量が少なくても分析が実現できる「スパースモデリング」について、その歴史から最先端の世界までをご紹介してきました。

 株式会社HACARUSでは、スパースモデリングを利用した産業・医療向けAIサービスを提供しています。本連載を通してスパースモデリングに興味を持っていただけた読者の皆様は、一度当社HPもご覧になっていただければ幸いです。

 お読みいただき、ありがとうございました。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ITエンジニアのためのスパースモデリング入門連載記事一覧

もっと読む

この記事の著者

田辺 広樹(タナベヒロキ)

 京都大学工学部情報学科に首席入学・首席卒業した後に進学した京都大学大学院情報学研究科修士課程を1.5年で早期修了し、現在は同研究科の後期課程に在籍中。日本学術振興会特別研究員DC1。専門は数理最適化だが、Webや機械学習など、幅広いエンジニアリングスキルを持つ。「ざるご」という名義でYouTube...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12662 2020/09/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング