Helve’s Python memo

Pythonを使った機械学習やデータ分析の備忘録

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

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

目次

はじめに

通常の重回帰モデルは次式で表される。
\displaystyle \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}として次式で表す。
\displaystyle \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は次式で表される。
\displaystyle {\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クラスで行う。

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}を求める。
\displaystyle 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クラスで行う。

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}を求める。
\displaystyle 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クラスで行う。

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}を求める。
\displaystyle 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
ここで、\alpharはハイパーパラメータである。

Elastic NetはElasticNetクラスで行う。

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: 説明変数)
※Adblockが有効の場合やモバイル版ページでは、シェアボタンをクリックできません