Elastic Net | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

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)
===============================================================================

Ridgeでの係数
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]
Elastic Netでの係数
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]
「Ridgeの平均2乗誤差」と「ElasticNetの平均2乗誤差」
 Ridgeの平均2乗誤差      33.53679721129215
 ElasticNetの平均2乗誤差 42.92278373382498