※記事内に商品プロモーションを含むことがあります。
はじめに
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
クラスで行う。
|
|
引数の説明は以下の通り。
引数 | 説明 |
---|---|
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
クラスで行う。
|
|
引数の説明は以下の通り。
引数 | 説明 |
---|---|
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
クラスで行う。
|
|
引数の説明は以下の通り。
引数 | 説明 |
---|---|
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
クラスで行う。
|
|
引数の説明は以下の通り。
引数 | 説明 |
---|---|
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