Lasso回帰によって、連続データを線形回帰分析する手法を、実装・解説します。
本記事ではLasso Regressorを実装します。
Lasso回帰はL1ノルムのペナルティを与える解析手法です。
これは回帰直線とデータの誤差に加えて、「係数w, bの絶対値」を誤差に加えるというペナルティ手法です。
このL1ノルムによって、係数wがスパースになることが知られています。
Lasso回帰分析は以下のscikit-learnマップの黒矢印に対応します。
目的変数の量を求める→サンプル数10万以下→説明変数xの一部の特徴量が重要→[Lasso Regressor]
です。
Lasso Regressorの実装
早速実装して、前回のSGDとの結果を比較します。
前回と同様に本記事では、住宅価格のデータを使用して実装します。
Boston house-prices (ボストン市の住宅価格)と呼ばれます。
被説明変数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:Lasso Regressorを適用する------------------------------------------- clf_lasso= linear_model.Lasso(alpha=1.0) clf_lasso.fit(X_train, Y_train) print("\nLassoでの係数") print(clf_lasso.intercept_) print(clf_lasso.coef_) #解説7:テストデータでの誤差を比較する------------------------------------------- Y_pred=clf.predict(X_test) Y_lasso_pred=clf_lasso.predict(X_test) print("\n「SGDの平均2乗誤差」と「Lassoの平均2乗誤差」") RMS=np.mean((Y_pred - Y_test) ** 2) RMS_lasso=np.mean((Y_lasso_pred - Y_test) ** 2) print(RMS) print(RMS_lasso) |
結果は次の通りになります。
上記結果は、SGDの場合とLassoの場合の回帰直線の係数を示しています。
Lassoでは係数が0になっている部分が多いことが分かります。
実装コードを解説します。
#解説6:Lasso Regressorを適用する——————————————-
clf_lasso= linear_model.Lasso(alpha=1.0)
ここでLasso回帰を指定しています。アルファはL1ノルムのペナルティの大きさを示しており、アルファが大きいほど正則化(ペナルティ具合)が大きくなります。
#解説7:テストデータでの誤差を比較する——————————————-
ここでテストデータに対して、作成した回帰直線で家賃yを推定し誤差を求めています。
Lassoの方が誤差は少し大きくなっています。
ですが、Lassoは多くの係数がゼロとなっており、
説明変数xが13次元のうち、以下の青文字の部分のみが家賃に効いています。
- CRIM 犯罪発生率
- ZN 住居区画の密集度
- INDUS 非小売業の土地割合
- CHAS チャールズ川 (1: 川の周辺, 0: それ以外)
- NOX NOx 濃度
- RM 住居の平均部屋数
- AGE 1940 年より前に建てられた物件の割合
- DIS 5 つのボストン市の雇用施設からの重み付き距離
- RAD 大きな道路へのアクセスしやすさ
- TAX $10,000 ドルあたりの所得税率
- PTRATIO 教師あたりの生徒数
- B 黒人の比率
- LSTAT 低所得者の割合
直感的に解釈すると、部屋数は家の大きさを左右します。
下の4項目は単純に富裕層が住む地域かそうでないかを表しているように思えます。
意外なことに大きな道路へのアクセスのしやすさや、主要な雇用施設への距離は関係ないようです。
車で移動する分にはあまり重要でないのかもしれません。
Lasso回帰であれば、こんな感じで、説明変数のどの特徴が重要なのかを考察することができます。
それでは「結局、Lasso Regressionって何をやっていたの?」を説明します。
Lasso Regressionの心
正確な情報は以下をご覧ください。
●scikit-learnのLasso Regressorの解説ページ
SGD回帰と同じく、重みw, bを変化させて、学習データと回帰直線の誤差が少なくなる方向へ学習させます。
ただし、L1ノルムのペナルティを誤差に加え、wがスパース(0が多くなる)ようにします。
イメージは次の図の通りです。
[引用 https://www.slideshare.net/yasunoriozaki12/prml-29439402]
右側のL1ノルムの場合、ひし形になるので、w*=1, w1=0のとがった点で、誤差が最小になりやすいです。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第15回:Lasso回帰での回帰分析でした。
次回はRidge回帰について説明します。