ラッソ回帰 | python3Xのブログ

python3Xのブログ

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

ラッソ回帰は説明変数(特徴量)の数が多い場合

その数を抑えるのに有効だと思います。

係数に0が多く並びますが、それが特徴です。

住宅価格の推定値に関する誤差はSDGに比べて

ラッソ回帰の方が大きいことが分かります。

# ① ライブラリのインポートーーーーーーーーーーーーーーーーーーーーーーーーー
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__
 
# ② 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
 
# ③ データの整形-----------------------------
sc=preprocessing.StandardScaler()
sc.fit(X)
X=sc.transform(X)
 
# ④ 訓練用データとテスト用データに分割する(8割を訓練用、2割をテスト用に分割する)
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y, test_size=0.2, random_state=0)
 
# ⑤ SGD Regressorを適用する(確率的勾配降下法を使った回帰)
clf = linear_model.SGDRegressor(max_iter=1000)
clf.fit(X_train, Y_train)
 
print("SGDでの係数")
print(clf.intercept_)
print(clf.coef_)
 
# ⑥ Lasso Regressorを適用する (コスト関数:J(θ) = MSE(θ) + αΣ|θ_i| )
# アルファはL1ノルムのペナルティの大きさを示しており、
# アルファが大きいほど正則化(ペナルティ具合)が大きくなる。)

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_)
 
# ⑦ テストデータでの誤差を比較する(回帰直線による推定値 ー テスト用データの値=誤差:ラッソ回帰の方が値が大きい)
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("\n SGDの平均2乗誤差  ",RMS)
print("\n Lassoの平均2乗誤差",RMS_lasso)
========================================================================

SGDでの係数
[22.47721977]
[-1.02805403  1.04400755  0.03630031  0.5901338  -1.86819484  2.60115067
 -0.08700398 -2.91459995  2.11885813 -1.85121929 -2.26234865  0.73950916
 -3.5159559 ]

Lassoでの係数
22.575430340523432
[-0.          0.         -0.          0.         -0.          2.51692604
 -0.         -0.         -0.         -0.1811126  -1.77331473  0.05691698
 -3.57188137]

「SGDの平均2乗誤差」と「Lassoの平均2乗誤差」

 SGDの平均2乗誤差   33.49289462699208

 Lassoの平均2乗誤差 40.348597574959406