LoginSignup
9
7

More than 3 years have passed since last update.

scikit-learnで多項式回帰にスパースモデリングを試す

Last updated at Posted at 2021-03-23

はじめに

スパースモデリングは、解のスパース性を仮定して、少ないデータからでもデータの関係をモデル化できるようにする手法です。大量のデータがあることを前提にデータの関係をモデル化するディープラーニングとは対照的なものです。
理解を深めるため、scikit-learnで「ほとんどの係数がゼロの多項式関数」と解のスパース性を仮定した多項式回帰の問題を解いてみます。

この記事でやること

この記事でやらないこと

  • 詳細な数学的解説
  • 最新アルゴリズム(各種座標降下法など)の紹介
  • アルゴリズムの選択方針、パラメーターの調整方針
  • スパースコーディング

スパースモデリングにおけるスパース性の仮定

スパース性の仮定
上の図の左側は、

  • 観測されたデータを「結果」とする
  • n個の「要因」が「結果」をもたらした、とモデル化した

ことを表したものです。

上の図の右側は、

  • 要因はn個も考えられるけれども、そのうち実際に結果に関わるものは極少数で、大部分は関係がない

と仮定したことを表したものです。これが「スパース性を仮定する」と良い、スパース性を前提としたモデル化を「スパースモデリング」と言います。

多項式回帰を例題にする

具体的に考えるために、先程の図を多項式回帰の問題と考えることにします。
sparse-reg.png
通常、多項式回帰は最小二乗法を使って解くことを考えます。しかし、モデルの説明変数$w_i$の数に対してデータの数が少ないときは過学習が起こります。

例として、真の関数を$$y = -2.59x^{4} + 0.776x^{29}$$とし、そのうちノイズの入った11点しかデータが取れなかった場合を考えます。
subject.png
ここで、$$y = \sum_{i=0}^{39} w_i x^i$$とモデル化し、scikit-learnのLinearRegressionを使って、最小二乗法による多項式回帰を実行してみます。

from sklearn.linear_model import LinearRegression
model = LinearRegression()

linear-crop-qz.png
確かに過学習が起きているらしいことが確認できました。
今回は、説明変数40個のモデルに対してデータが11個しか与えられていませんでした。この状況は、一般的なディープラーニングのアプローチで期待されている「モデルの説明変数に対して十分な量のデータがある状況」とは真逆のものです。

scikit-learnでスパースモデリングを試す

ここで、「全40変数の内ほとんどの変数はゼロだが、どこが非ゼロかはわからない」というスパース性の仮定を置きます。この仮定を使うには「非ゼロの変数が少ないほど良い」としたアルゴリズムを使えば良いことになります。

以下に、scikit-learnで実装されているアルゴリズムを使った例を示します。
(各アルゴリズム名の見出しは、scikit-learnのドキュメントへのリンクになっています)

Lasso

Lassoは、最小二乗法の目的である「残差の二乗和の最小化」に、L1正則化項を加え、これを最小化できる係数を決定するものです。

from sklearn.linear_model import Lasso
model = Lasso(alpha=0.001)

lasso-qz.png

Elastic Net

Elastic Netは、(Lasso回帰で使われる)L1正則化項に加え、(Ridge回帰で使われる)L2正則化項も加えたものです。

from sklearn.linear_model import ElasticNet
model = ElasticNet(alpha=0.001)

elasticnet-crop-qz.png

Orthogonal Matching Pursuit model (OMP)

OMPは、先程までの「最小二乗法+正則化項」とは異なり、「最良の係数を1つずつ見付け、順に付け加えていく」というイメージで係数を決定します。

from sklearn.linear_model import OrthogonalMatchingPursuit
model = OrthogonalMatchingPursuit(n_nonzero_coefs=2)

omp-qz.png

LARS

LARSは、「特徴量の値と暫定での誤差との相関が最も大きい特徴量を1つずつ加えていく」というものです。

from sklearn.linear_model import Lars
model = Lars(n_nonzero_coefs=2)

lars-qz.png

Lasso-Lars

Larsを使ったLasso回帰です。詳細は分かりませんでした。

from sklearn.linear_model import LassoLars
model = LassoLars(alpha=0.001)

lassolars-qz.png

各係数の値

どのアルゴリズムも過学習を抑えられていることが分かりました。
では、最小二乗法で係数を求めたときの実際の各係数を見てみます。
linear-coef-qz.png
全係数に値が入っています。

続いて、Lasso-Larsで係数を求めたときの実際の各係数です。
lassolars-coef-qz.png
少ない係数で多項式が表現できています。

まとめ

スパースモデリングの概要を説明し、簡単な多項式回帰の問題でスパースモデリングを試してみました。

「スパースモデリングは少ないデータからでも良質な学習ができる」とだけ聞くと、ディープラーニングより優れた方法という印象を受けるかもしれませんが、スパースモデリングが有効に作用するのはスパース性の仮定が前提にある場合だけです。ディープラーニングとスパースモデリングは、それぞれが前提としている状況が異なるので優劣の関係にはありません。
問題設定がスパース性とマッチしていれば、スパースモデリングはディープラーニングより好ましい結果を与えてくれるでしょう。
summary-qz.png

Reference

9
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7