In [40]:
# 正則化項のある回帰
# ラッソ回帰 リッジ回帰
"""
普通のロジスティック回帰モデルでは最小2乗誤差を目指しますが、
入力に対して出力が敏感に変化してしまう場合は、
過学習によって訓練Scoreと検証Scoreが一致しない場合があります。
正則化項 regularzation を追加して緩慢にします。
正則化項は1次のときラッソ回帰、2次のときリッジ回帰といいます。
"""
Out[40]:
'\n普通のロジスティック回帰モデルでは最小2乗誤差を目指しますが、\n入力に対して出力が敏感に変化してしまう場合は、\n過学習によって訓練Scoreと検証Scoreが一致しない場合があります。\n正則化項 regularzation\u3000を追加して緩慢にします。\n正則化項は1次のときラッソ回帰、2次のときリッジ回帰といいます。\n'
In [42]:
# サンプルデータを用意します。

# モジュール
import numpy as np
import scipy as sp
import pandas as pd
import sklearn

import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
sns.set()
%matplotlib inline

%precision 3

import requests
import zipfile
import io

# サンプルデータをrequests.get().content (ダウンロード) する
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.data'
res = requests.get(url).content
auto = pd.read_csv(io.StringIO(res.decode('utf-8')), header=None)
auto.columns = ['symboling','nomalalined-losses','make','fuel-type','aspiration','num-of-doors',
               'body-style','drive-sheels','enfine-location','wheel-base','length','width','height',
                'corb-weight','engine-type','num-of-cylinders','engin-size','fuel-system','bore',
                'stroke','compression-ratio','horsepower','peak-rpm','city-mpg','highway-mpg','price']
auto.head(5)

# horsepower width height の3つを説明変数として自動車の価格を求めてみよう

# 欠損値の除去
data = auto[['price', 'horsepower', 'width', 'height']]
data.isin(['?']).sum()
"""
price         4
horsepower    2
width         0
height        0
dtype: int64
"""

# ?をNaNに置換して、行を削除する
data = data.replace('?', np.nan).dropna()
print(data.shape) # (199, 4)
data .head()

# horsepower width height の3つを説明変数として自動車の価格を求めてみよう

# 欠損値の除去
data = auto[['price', 'horsepower', 'width', 'height']]
data.isin(['?']).sum()
"""
price         4
horsepower    2
width         0
height        0
dtype: int64
"""

# ?をNaNに置換して、行を削除する
data = data.replace('?', np.nan).dropna()
print(data.shape) # (199, 4)
data .head()
(199, 4)
(199, 4)
Out[42]:
price horsepower width height
0 13495 111 64.1 48.8
1 16500 111 64.1 48.8
2 16500 154 65.5 52.4
3 13950 102 66.2 54.3
4 17450 115 66.4 54.3
In [49]:
# 今一度 sklearn重回帰モデルの場合を確認します。
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 説明変数X モデル変数yの定義
X = data.drop('price', axis=1) # price列を落とす
y = data['price']

# データを分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

# 機械学習モデルのインスタンス作成と学習
model_lr = LinearRegression()
model_lr.fit(X_train, y_train)

# 決定係数 score
print('score test : {} '.format(model_lr.score(X_test, y_test)))
print('score train: {} '.format(model_lr.score(X_train, y_train)))
score test : 0.7370688738125768 
score train: 0.7333575683901379 
In [50]:
# ではリッジ回帰でやってみます
from sklearn.linear_model import Ridge

# 機械学習モデルのインスタンス作成と学習
model_ridge = Ridge()
model_ridge.fit(X_train, y_train)

# 決定係数 score
print('score test : {} '.format(model_ridge.score(X_test, y_test)))
print('score train: {} '.format(model_ridge.score(X_train, y_train)))
score test : 0.7377676885006833 
score train: 0.7333547383511867 
In [51]:
"""
今回はほぼ同じだった。
一般的には リッジ回帰のほうが重回帰よりも
訓練Scoreは低いけども検証Scoreのほうが高く出る。
"""
Out[51]:
'\n今回はほぼ同じだった。\n一般的には リッジ回帰のほうが重回帰よりも\n訓練Scoreは低いけども検証Scoreのほうが高く出る。\n'