Pythonでelastic net回帰

統計学




elastic net

Pythonでelastic netを実行していきます。

elastic netは、sklearnのlinear_modelを利用します。

インポートするのは、以下のモジュールです。

from sklearn.linear_model import ElasticNet

elastic net回帰

説明変数の中に非常に相関の高いものがるときにはそれらの間で推定が不安定になることが知られている。
これは、多重共線性として知られている。

この多重共線性が生じる場合、正則化項として、ridge回帰とlasso回帰で用いる正則化項の両方を使う方法をelastic netという。

スパースモデリング-入門メモ-
...

sklearnのelastic net回帰

L1ノルムの割合をαとし、L2ノルムの割合を(1-α)と設定する。


$$min \left[ \Vert y – \displaystyle \sum_{ j }^{ } \beta_jx_i^{j} \Vert_2^2 + \lambda( \alpha \Vert \beta \Vert_1 + (1-\alpha) \Vert \beta \Vert_2^2 ) \right]$$

sklearnでは、引数alphaは上の式のλ、l1_ratioはαとなっていることに注意が必要である。

最適化は、

1 / (2 * n_samples) * ||y - Xw||^2_2
+ alpha * l1_ratio * ||w||_1
+ 0.5 * alpha * (1 - l1_ratio) * ||w||^2_2

公式サイト

Pythonプログラム

係数を表示するプログラムです。

データには、ボストンデータを使います。

Xの変数は、13個の重回帰式になります。

elastic-netを実行していきましょう。

ソースコード


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.datasets import load_boston

# サンプルデータを用意
dataset = load_boston()

# 説明変数データを取得
data_x = pd.DataFrame(dataset.data, columns=dataset.feature_names)

#被説明変数データを取得
data_y = pd.DataFrame(dataset.target, columns=['target'])


#データの
print("説明変数行列のサイズ:{}".format(data_x.shape[1]))
print("被説明変数のサイズ:{}".format(data_y.shape))
print("説明変数の変数の個数:{}".format(data_x.shape[1]))
coef_n = data_x.shape[1]

decimal_p = 3

#ElasticNet
elastic_net = ElasticNet(alpha = 0.5).fit(data_x, data_y)
print(elastic_net.coef_.round(decimal_p))

結果

[-0.092 0.054 -0.032 0. -0. 1.722 0.009 -0.99 0.311 -0.016
-0.804 0.009 -0.707]

参考

1.1. Linear Models
...
タイトルとURLをコピーしました