はじめに #
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つ以上含まれる場合、回帰係数が正しく求められないことがある。 この問題は多重共線性と呼ばれる。詳細は以下を参照。
多重共線性の問題を回避するため、回帰係数の大きさに制限を加える方法(正則化)がある。 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 : 説明変数) |