Erastic Netはリッジ回帰とラッソ回帰を混ぜ合わせたもの。
その割合はrで変更される。r = 0 のときはリッジ回帰と等しく
r = 1のときはラッソ回帰と等しい。
そして、そのコスト関数は
J(θ) = MSE(θ) + rαΣ|θ_i| + (1 - r)α/2Σθ_i^2
の式で表される。
今回使うデータは以前も紹介しました『Scikit-learnとTensorflowによる実践機械学習』
で出てきた住宅価格を使います。
被説明変数yは住宅価格の中央値です。
全ての特徴量を使用して回帰をおこないます。
元は以下のURLにあります。
この実行結果からElastic Netの係数に0がいくつか見受けられることが分かります。
もちろん r を0にしてやれば0は消え、リッジ回帰と同じ結果になるハズです。
http://neuro-educator.com/ml17/
# 1:ライブラリのインポート--------------------------------
import numpy as np #numpyという行列などを扱うライブラリを利用
import pandas as pd #pandasというデータ分析ライブラリを利用
import matplotlib.pyplot as plt #プロット用のライブラリを利用
from sklearn import cross_validation, preprocessing, linear_model #機械学習用のライブラリを利用
import sklearn
sklearn.__version__
# 2:Housingのデータセットを読み込む--------------------------------
df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+')
df.columns=['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
X_rm=df[['RM']].values
X=df.iloc[:, 0:13]
#X=df[['AGE']].values
Y=df['MEDV'].values
# 3:データの整形-------------------------------------------------------
sc=preprocessing.StandardScaler()
sc.fit(X)
X=sc.transform(X)
# 4:学習データとテストデータに分割する-------------------------------
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y, test_size=0.2, random_state=0)
#5:Ridge Regressorを適用する-------------------------------------------
# リッジ回帰 コスト関数 J(θ) = MSE(θ) + α/2 Σθ_i^2
# 閉経式の解 Θ = [(X・T)・X + αA]^-1・(X・T)・y Tは転置、^-1は逆行列
clf_ridge= linear_model.Ridge(alpha=1.0)
clf_ridge.fit(X_train, Y_train)
print("\nRidgeでの係数")
print(clf_ridge.intercept_)
print(clf_ridge.coef_)
#解説6:Elastic Net Regressorを適用する-------------------------------------------
# リッジ回帰とラッソ回帰を混ぜ合わせたもので、r=0でリッジ回帰と等しく、1でラッソ回帰と等しくなる
# Elastic Netのコスト関数 J(θ) = MSE(θ) + rα Σ|θ_i| + (1 - r)α/2 Σθ_i^2
clf_er= linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5)
clf_er.fit(X_train, Y_train)
print("\nElastic Netでの係数")
# intercept:デフォルトは TRUE で,この場合は自動的に計画行列(説明変数の行列)に定数項が加わる
print(clf_er.intercept_)
# coef:回帰係数ベクトル.intercept=T (デフォルト) ならば第 1 要素が回帰式の定数項とる
print(clf_er.coef_)
#7:テストデータでの誤差を比較する-------------------------------------------
Y_ridge_pred=clf_ridge.predict(X_test)
Y_er_pred=clf_er.predict(X_test)
# RMS: root mean square
print("\n「Ridgeの平均2乗誤差」と「ElasticNetの平均2乗誤差」")
RMS_ridge=np.mean((Y_ridge_pred - Y_test) ** 2)
RMS_er=np.mean((Y_er_pred - Y_test) ** 2)
print("\n Ridgeの平均2乗誤差 ", RMS_ridge)
print("\n ElasticNetの平均2乗誤差", RMS_er)
===============================================================================
22.4815111824646
[-1.01649357 1.02733437 0.01192747 0.59818575 -1.83082046 2.61307788
-0.09465198 -2.88262602 2.04774814 -1.78279739 -2.25280667 0.73945729
-3.50110119]
22.540500782122447
[-0.40309361 0.19512626 -0.34776665 0.35388271 -0.2235169 2.25878326
-0. -0. -0. -0.46998832 -1.51434239 0.43646099
-2.28985838]