Python

Pythonで機械学習を学ぶ ラッソ回帰・リッジ回帰

重回帰では、回帰係数の推定で、予測値と目的変数の二乗誤差を最小にするようする。ラッソ回帰、リッジ回帰は、二乗誤差を小さくしようとしつつ、回帰係数自体が大きくなることを避ける。具体的には、回帰係数を推定する際、損失関数にモデルの複雑さを表す項を追加し、それを含め誤差を最小化するようにする。

以前に紹介した重回帰を改良して、リッジ回帰を追加します。

重回帰とリッジ回帰を比較してみる

import pandas as pd
import requests
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 読み込み
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00477/Real%20estate%20valuation%20data%20set.xlsx'
res = requests.get(url).content

data = pd.read_excel(res, sheet_name=0, encoding="utf-8", header=0)

data.columns = ['No', 'X1 transaction date', 'X2 house age', 'X3 distance to the nearest MRT station',
                'X4 number of convenience stores', 'X5 latitude', 'X6 longitude', 'Y house price of unit area']

# 確認
print('データ形式:{}'.format(data.shape))
print(data.head())

# 使うものに絞る
data = data[['X2 house age', 'X3 distance to the nearest MRT station',
             'X4 number of convenience stores', 'X5 latitude', 'X6 longitude', 'Y house price of unit area']]

# データ形式の確認
print(data.dtypes)

# 相関を確認
print(data.corr())

# 目的変数、説明変数
X = data.drop('Y house price of unit area', axis=1)
y = data['Y house price of unit area']

# 訓練データ、テストデータの準備
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)


# モデルの構築と評価
model_linear = LinearRegression()
model_ridge = Ridge(random_state=0)

# 学習
model_linear.fit(X_train, y_train)
model_ridge.fit(X_train, y_train)

# 結果
print('LinearRegression')
print('train:{:.8f}'.format(model_linear.score(X_train, y_train)))
print('test:{:.8f}'.format(model_linear.score(X_test, y_test)))
print('')
print('Ridge')
print('train:{:.8f}'.format(model_ridge.score(X_train, y_train)))
print('test:{:.8f}'.format(model_ridge.score(X_test, y_test)))

結果

LinearRegression
train:0.56951458
test:0.56810185

Ridge
train:0.53779037
test:0.54716499

結果として、重回帰のほうが正解率が高いです。テストと学習時の正解率はリッジ回帰のほうが大きく向上していることがわかります。