ElasticNet回帰によって、連続データを線形回帰分析する手法を、実装・解説します。
本記事ではElasticNetを実装します。
ElasticNet回帰はL1ノルムのペナルティとL2ノルムのペナルティの両方を与える解析手法です。
LassoとRidgeの組み合わせになります。
Elastic Net回帰分析は以下のscikit-learnマップの黒矢印に対応します。
目的変数の量を求める→サンプル数10万以下→説明変数xの特徴量の一部が重要→[ElastiNet Regressor]
です。
ElasticNet Regressorの実装
実装して、Ridge回帰との結果を比較します。
これまでと同様に、住宅価格のデータを使用して実装します。
被説明変数yは住宅価格の中央値です。
本記事では、全部の特徴量を使用した回帰を行います。
実装コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # 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を適用する------------------------------------------- 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を適用する------------------------------------------- clf_er= linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5) clf_er.fit(X_train, Y_train) print("\nElastic Netでの係数") print(clf_er.intercept_) print(clf_er.coef_) #7:テストデータでの誤差を比較する------------------------------------------- Y_ridge_pred=clf_ridge.predict(X_test) Y_er_pred=clf_er.predict(X_test) 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(RMS_ridge) print(RMS_er) |
結果は次の通りになります。
係数を比較すると、ElasticNetではRidgeよりも0となっている係数が多いです。
※ただし、Lassoのときよりは少ないです。
実装コードを解説します。
#解説6:Elastic Net Regressorを適用する——————————————-
clf_er= linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5)
ここでElasticNet回帰を指定しています。
アルファはL1およびL2ノルムのペナルティの大きさを示しており、アルファが大きいほど正則化(ペナルティ具合)が大きくなります。
l1_ratioは、L1, L2ペナルティのうち、L1の割合を示しています。
それでは「結局、ElaticNet Regressionって何をやっていたの?」を説明します。
ElasticNet Regressionの心
正確な情報は以下をご覧ください。
●scikit-learnのElasticNet Regressorの解説ページ
SGD回帰などと同じく、重みw, bを変化させて、学習データと回帰直線の誤差が少なくなる方向へ学習させます。
ただし、L1ノルムおよびL2ノルムのペナルティを誤差に加えています。
ElasticNetはLasso回帰では係数が0になりすぎる場合に使用します。
アルファでL1とL2の大きさを決め、l1_ratio(以下の式のロー)でL1の割合を設定します。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第17回:ElasticNet回帰での回帰分析でした。
次回はSVR(Support Vector Regression)による回帰について説明します。