メインコンテンツへスキップ

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

·2498 文字·5 分
目次

はじめに
#

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

通常の重回帰モデルは次式で表される。

$$ \hat{y} = w_0 + w_1 x_1 + w_2 x_2 + ... + w_n x_n $$

ここで、\(\hat{y}\)は予測値、\(w_0, w_1, ..., w_n\)は回帰係数、\(x_1, ..., x_n\)は説明変数である。 さらに、回帰係数と説明変数をそれぞれベクトル\(\boldsymbol{w, x}\)として次式で表す。

$$ \hat{y} = \boldsymbol{w}^\top \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}^\top \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}\)を求める。

$$ 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}\)を求める。

$$ 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}\)を求める。

$$ 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クラスで行う。

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: 説明変数)

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Scikit-learnでデータをスケール変換する
··4596 文字·10 分
Pythonの機械学習用ライブラリScikit-learnに実装されている、スケール変換について調べた。
Scikit-learn ランダムフォレスト回帰のfeature_importances_の定義
·1236 文字·3 分
Scikit-learnの回帰木やランダムフォレスト回帰のクラスには、Feature Importances (FI) という説明変数の重要度を示す指標がある。これは、各説明変数による予測誤差の二乗平均の減少量に対して、データ点数の重みを掛けて求めた値である。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。
KerasのステートフルRNNで学習を高速化する
·3032 文字·7 分
KerasのステートフルRNNについて解説する。
Kerasの時系列予測でgeneratorを使って大容量データを扱う 前編
·2669 文字·6 分
Kerasの時系列予測で、Recurrentレイヤに入力するためのデータを生成するgeneratorクラスの作り方について述べる。
Kerasを使ったRNN, GRU, LSTMによる時系列予測
·1786 文字·4 分
KerasのRNN, GRU, LSTMレイヤを使って時系列データを学習させる。