※記事内に商品プロモーションを含むことがあります。
はじめに
Elastic Net は回帰手法の1つで、$L_1$ノルムと$L_2$ノルムを用いて回帰係数の重みに制限を加えることで、予測性能を向上させることを目的としています。Elastic Netはラッソ回帰とリッジ回帰を組み合わせたものと言えます。
この記事ではPythonとScikit-learnによるサンプルコードも示します。実行環境は以下の通りです。
- Python: 3.9.7
- NumPy: 1.20.3
- sklearn: 0.24.2
Elastic Netのモデル
Elastic Netの予測モデルは、重回帰モデルやリッジ回帰モデルなどと同様に次式で表されます。
$$ y = w_1 x_1 + w_2 x_2 + … + w_N x_N + w_0 $$
ここで、説明変数の数を$N$, 説明変数を$x_1, x_2, …, x_N$, 目的変数を$y$と置いています。また、$w_1, w_2, …, w_N$は重み、$w_0$は切片です。簡単のため、重みと係数をまとめて
$$\boldsymbol{w}=[w_0, w_1, w_2, …, w_N]^{\top}$$
とベクトル化します。
Elastic Netでは、モデルの学習において、最小化する関数として次式の$J(\boldsymbol{w})$を考えます。
$$ J(\boldsymbol{w}) = \frac{1}{2} \mathrm{MSE}(\boldsymbol{w}) + \alpha r \sum_{i=1}^{M} |\boldsymbol{w}_i| + \frac{1}{2} \alpha (1-r) \sum_{i=1}^{M} \boldsymbol{w}_i^2 $$
右辺第1項の$\mathrm{MSE}(\boldsymbol{w})$は、予測値と実際の目的変数の平均二乗誤差 (mean square error, MSE) です。また、右辺第2項、右辺第3項はそれぞれ$L_1$ノルムと$L_2$ノルムによる正則化項です。
$\alpha$は正則化の強さを表すパラメータで、0以上の値を取ります。$r$は$L_1$ノルム正則化と$L_2$ノルム正則化の比率を表すパラメータで、0以上1以下の値を取ります。$r=0$のときは$L_2$ノルム正則化のみ有効になり、反対に$r=1$のときは$L_1$ノルム正則化のみ有効になります。
scikit-learnのElastic Net
ElasticNetクラス
scikit-learnではsklearn.linear_model.ElasticNet
というクラスにElastic Netが実装されています。
|
|
主なパラメータの意味は以下の通りです。
alpha
(float
): 正則化の強さ$\alpha$です。デフォルト値は1.0
.l1_ratio
(float
): L1ノルム正則化の比率$r$です。デフォルト値は0.5
.fit_intercept
(bool
):True
の場合、切片を計算します。予測モデルが原点を通ることが想定される場合はFalse
に設定します。tol
(float
): 最適化の許容誤差です。双対ギャップがtol
以下になると計算を停止します。デフォルトは1e-4
.random_state
(int
/None
): 学習時の乱数シード。selection
が'random'
のとき、常に同じ結果を得たい場合は適当な整数を指定します。None
の場合、結果は変わり得ます。デフォルトはNone
。selection
(str
):'cyclic'
に設定すると、係数を順々に更新します。'random'
に設定すると、係数をランダムな順序で更新します。tol
が1e-4
より大きい場合、'random'
に設定すると早く収束する可能性が高くなります。
また、主なメソッドは以下の通りです。
fit(X, y)
: 特徴量X
, クラスy
を教師データとして学習する。predict(X)
: 特徴量X
に対する予測結果を返す。
使用例
ElasticNet
クラスの使用例を示します。X_train
は行がサンプル、列が特徴量の2次元配列です(PandasのDataFrameなどでも可)。y_train
は目的変数の1次元配列です。次に、ElasticNet
クラスのオブジェクトをreg
という名前で作成します(reg
はregressorから名付けています)。
|
|
fit
メソッドで学習し、predict
メソッドで予測します。予測結果は1次元配列となります。
|
|
実行結果
|
|
係数を確認するにはreg.coef_
, 切片を確認するにはreg.intercept_
を表示します。
|
|
実行結果
|
|