JavaScriptを有効にしてください

Scikit-learnの正則化付き重回帰モデル

 ·   5 min read

はじめに

Pythonの機械学習ライブラリScikit-learnに実装されている重回帰モデルを調べた。
通常の線形回帰に、回帰係数を正則化するRidge回帰、Lasso回帰、Elastic Netを加えた4種類の回帰モデルの基本的なロジックと使用方法をまとめた。

通常の重回帰モデルは次式で表される。
$ \hat{y} = w_0 + w_1x_1 + w_2x_2 + … + w_nx_n$
ここで、$\hat{y}$は予測値、$w_0, w_1, …, w_n$は回帰係数、$x_1, …, x_n$は説明変数である。
さらに、回帰係数と説明変数をそれぞれベクトル$\boldsymbol{w, x}$として次式で表す。
$ \hat{y} = \boldsymbol{w}^T \boldsymbol{x}$
ここで、$\boldsymbol{x}$は$x_0$から$x_n$を含み、$x_0$は常に1である。

通常の重回帰モデルでは、説明変数$y$と予測値$\hat{y}$の平均二乗誤差 (MSE, Mean Squared Error) を最小化する回帰係数ベクトル$\boldsymbol{w}$を見つけることが目的となる。
MSEは次式で表される。
$$ {\rm MSE}(\boldsymbol{w})=\frac{1}{m}\sum_{i=1}^{m}(\boldsymbol{w}^T \boldsymbol{x}^i-y^i)$$

複数の説明変数がある回帰モデル(重回帰モデル)は、特徴量ごとの影響を回帰係数から解釈しやすいため、広く用いられている。
しかし、説明変数に似たような変数が2つ以上含まれる場合、回帰係数が正しく求められないことがある。
この問題は多重共線性と呼ばれる。詳細は以下を参照。
多重共線性とは何? Weblio辞書

多重共線性の問題を回避するため、回帰係数の大きさに制限を加える方法(正則化)がある。
Scikit-learnには、異なる制限を加える重回帰モデルであるRidge回帰、Lasso回帰、Elastic Netが実装されている。

環境

記事執筆時点でのバージョンは以下の通り。

  • Scikit-learn 0.20.2

通常の重回帰

通常の重回帰(単回帰も含む)はLinearRegressionクラスで行う。

1
2
sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, 
                                      copy_X=True, n_jobs=None)

引数の説明は以下の通り。

引数 説明
fit_intercept 切片を計算する
normalize 説明変数Xを事前に正規化する
copy_X FlaseならXが上書きされる
n_jobs=None 並列計算数。Noneは1コア、-1は全コアを使う

クラス変数 (attribute)は以下の通り。

変数 説明
coef_ 回帰係数
intercept_ 切片

主なメソッドは以下の通り。

メソッド 説明
fit(X, y) 回帰モデルをあてはめる(X: 説明変数。y:目的変数)
predict(X) 予測する(X: 説明変数)

Ridge回帰

Ridge回帰では、回帰係数の重みを制限するため、次式のコスト関数$J$を最小化する回帰係数$\boldsymbol{w}$を求める。
$$ J(\boldsymbol{w})={\rm MSE}(\boldsymbol{w}) + \alpha \frac{1}{2} \sum_{i=1}^{n} \boldsymbol{w}_i^2$$
右辺の第二項は正則化項と呼ばれる。
Ridge回帰で加える正則化をL2正則化という。

また、$\alpha$はハイパーパラメータであり、望ましい値を探す必要がある。
$\alpha=0$のとき通常の重回帰と同じである。一方、$\alpha$が非常に大きい場合、全ての係数が0に近づくため、データの平均を出力するようになる。

Ridge回帰はRidgeクラスで行う。

1
2
3
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, 
                           normalize=False, copy_X=True, 
                           max_iter=None, tol=0.001, random_state=None)

引数の説明は以下の通り。

引数 説明
alpha 正則化項のハイパーパラメータ
fit_intercept 切片を計算する
normalize 説明変数Xを事前に正規化する
copy_X FlaseならXが上書きされる
max_iter コスト関数の勾配計算の最大反復回数
tol 解の許容精度
random_state 乱数シード

クラス変数 (attribute)は以下の通り。

変数 説明
coef_ 回帰係数
intercept_ 切片
n_ite_ 反復計算回数

主なメソッドは以下の通り。

メソッド 説明
fit(X, y) 回帰モデルをあてはめる(X: 説明変数。y:目的変数)
predict(X) 予測する(X: 説明変数)

Lasso回帰

Lasso回帰では、回帰係数の重みを制限するため、次式のコスト関数$J$を最小化する回帰係数$\boldsymbol{w}$を求める。
$$ J(\boldsymbol{w})={\rm MSE}(\boldsymbol{w}) + \alpha \sum_{i=1}^{n} | \boldsymbol{w}_i |$$
Lasso回帰で加える正則化をL1正則化という。
また、$\alpha$はハイパーパラメータであり、望ましい値を探す必要がある。

LassoはLeast Absolute Shrinkage and Selection Operatorの略である。
Lasso回帰では、重要度の低い説明変数の係数は0となる。

Lasso回帰はLassoクラスで行う。

1
2
3
4
5
sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, 
                           normalize=False, copy_X=True, 
                           max_iter=1000, tol=0.0001, 
                           warm_start=False, positive=False, 
                           random_state=None, selection="cyclic")

引数の説明は以下の通り。

引数 説明
alpha 正則化項のハイパーパラメータ
fit_intercept 切片を計算する
normalize 説明変数Xを事前に正規化する
copy_X FlaseならXが上書きされる
max_iter コスト関数の計算の最大反復回数
tol 解の許容精度
warm_start Trueなら前回の解を初期値とする
positive Trueなら係数を全て正とする
random_state 乱数シード
selection "cyclic"なら係数を順番に更新。"random"ならランダムに更新

主なクラス変数 (attribute)は以下の通り。

変数 説明
coef_ 回帰係数
intercept_ 切片
n_ite_ 反復計算回数

主なメソッドは以下の通り。

メソッド 説明
fit(X, y) 回帰モデルをあてはめる(X: 説明変数。y:目的変数)
predict(X) 予測する(X: 説明変数)

Elastic Net

Elastic NetはLasso回帰のL1正則化とRidge回帰のL2正則化を合わせたもので、次式のコスト関数$J$を最小化する回帰係数$\boldsymbol{w}$を求める。
$$ J(\boldsymbol{w})={\rm MSE}(\boldsymbol{w}) + \alpha r \sum_{i=1}^{n} | \boldsymbol{w}_i | + \frac{\alpha(1-r)}{2} \sum_{i=1}^{n} \boldsymbol{w}_i^2 $$
ここで、$\alpha$と$r$はハイパーパラメータである。

Elastic NetはElasticNetクラスで行う。

1
2
3
4
5
6
sklearn.linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5, 
                                fit_intercept=True, normalize=False, 
                                max_iter=1000, copy_X=True, 
                                tol=0.0001, warm_start=False, 
                                positive=False, random_state=None, 
                                selection='cyclic')

引数の説明は以下の通り。

引数 説明
alpha ハイパーパラメータ
l1_ratio ハイパーパラメータ
fit_intercept 切片を計算する
normalize 説明変数Xを事前に正規化する
max_iter コスト関数の計算の最大反復回数
copy_X FlaseならXが上書きされる
tol 解の許容精度
warm_start Trueなら前回の解を初期値とする
positive Trueなら係数を全て正とする
random_state 乱数シード
selection "cyclic"なら係数を順番に更新。"random"ならランダムに更新

主なクラス変数 (attribute)は以下の通り。

変数 説明
coef_ 回帰係数
intercept_ 切片
n_ite_ 反復計算回数

主なメソッドは以下の通り。

メソッド 説明
fit(X, y) 回帰モデルをあてはめる(X: 説明変数。y:目的変数)
predict(X) 予測する(X: 説明変数)

参考

sklearn.linear_model.LinearRegression — scikit-learn 0.24.0 documentation
sklearn.linear_model.Ridge — scikit-learn 0.24.0 documentation
sklearn.linear_model.Lasso — scikit-learn 0.24.0 documentation
sklearn.linear_model.ElasticNet — scikit-learn 0.24.0 documentation

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です