Ridge回帰によって、連続データを線形回帰分析する手法を、実装・解説します。
本記事ではRidge Regressorを実装します。
Ridge回帰はL2ノルムのペナルティを与える解析手法です。
これは回帰直線とデータの誤差に加えて、「係数w, bの2乗和」を誤差に加えるというペナルティ手法です。
このL2ノルムによって、係数wが非ゼロになりやすくなることが知られています。
(つまりどの特徴も重要視しようとします)
Ridge回帰分析は以下のscikit-learnマップの黒矢印に対応します。
目的変数の量を求める→サンプル数10万以下→説明変数xの特徴量がどれも重要→[Ridge Regressor]
です。
Ridge Regressorの実装
実装して、SGDとの結果を比較します。
これまでと同様に、住宅価格のデータを使用して実装します。
被説明変数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 | # 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:SGD Regressorを適用する------------------------------------------- clf = linear_model.SGDRegressor(max_iter=1000) clf.fit(X_train, Y_train) print("SGDでの係数") print(clf.intercept_) print(clf.coef_) #解説6: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_) #7:テストデータでの誤差を比較する------------------------------------------- Y_pred=clf.predict(X_test) Y_ridge_pred=clf_ridge.predict(X_test) print("\n「SGDの平均2乗誤差」と「Ridgeの平均2乗誤差」") RMS=np.mean((Y_pred - Y_test) ** 2) RMS_ridge=np.mean((Y_ridge_pred - Y_test) ** 2) print(RMS) print(RMS_ridge) |
結果は次の通りになります。
上記結果は、SGDの場合とRidgeの場合の回帰直線の係数を示しています。
ほとんど同じになっており、誤差も変わりません。
実装コードを解説します。
#解説6:Ridge Regressorを適用する——————————————-
clf_lasso= linear_model.Ridge(alpha=1.0)
ここでRidge回帰を指定しています。アルファはL2ノルムのペナルティの大きさを示しており、アルファが大きいほど正則化(ペナルティ具合)が大きくなります。
それでは「結局、Ridge Regressionって何をやっていたの?」を説明します。
Lasso Regressionの心
正確な情報は以下をご覧ください。
●scikit-learnのRidge Regressorの解説ページ
SGD回帰と同じく、重みw, bを変化させて、学習データと回帰直線の誤差が少なくなる方向へ学習させます。
ただし、L2ノルムのペナルティを誤差に加え、wの大きさがだいたい同じようになるようにします。
イメージは次の図の左側の通りです。
[引用 https://www.slideshare.net/yasunoriozaki12/prml-29439402]
左側のL2ノルムの場合、丸い形になるので、係数が0になりにくいという特徴があります。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第16回:Ridge回帰での回帰分析でした。
次回はElasticNetによる回帰について説明します。