scikit-learnでボストン住宅価格を回帰分析する
データセット読み込みと内容確認
Boston house-pricesデータセットは、米国ボストン市郊外の地域別の13種類の特徴と住宅価格の統計情報です。13種の項目は以下の内容です。
CRIM | 犯罪発生率 |
---|---|
ZN | 住居区画の密集度 |
INDUS | 非小売業の土地割合 |
CHAS | チャールズ川 (1: 川の周辺, 0: それ以外) |
NOX | NOx濃度 |
RM | 住居の平均部屋数 |
AGE | 1940年より前に建てられた物件割合 |
DIS | 5つのボストン市の雇用施設からの重み付き距離 |
RAD | 大きな道路へのアクセスしやすさ |
TAX | $10,000ドルあたりの所得税率 |
PTRATIO | 教師あたりの生徒数 |
B | 黒人の比率 1000(Bk – 0.63)^2 |
LSTAT | 低所得者の割合 |
回帰分析前の準備で、Bostonデータの読み込みとデータ内容を確認します。
- ボストンデータセットの読み込み [1]
- データセットdict_keysを確認 [2]
- データをPasdasデータフレームに代入して内容確認 [3,4]
- Seabornのpairplotで散布図行列を描画、ざっくり相関確認 [5,6]
# bostonデータ読み込み
from sklearn import datasets
boston = datasets.load_boston()
# bostonデータ確認(dict-keys)
boston.keys()
# bostonデータをPandasに代入してデータ確認
import pandas as pd
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names) # 説明変数(data)
boston_df['PRICE'] = boston.target # 目的変数(target)追加
boston_df.head()
boston_df.describe() # 統計量
# 散布図行列でざっくり相関を確認(全項目14×14)
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(boston_df) # seaborn.pariplotで散布図行列の描画
# RM(部屋数)と価格を指定して散布図行列をプロット
sns.pairplot(boston_df[['RM', 'PRICE']])
説明変数を一つだけ使って単回帰分析
始めは説明変数(特徴)を一つだけ使って回帰分析を行います。説明変数は正の相関が見られる部屋数(RM)を使います。目的変数は住宅価格です。
- データセット読み込み、説明変数(部屋数)と目的変数(価格)変数に代入 [1]
- モデル(LinearRegression)の作成と学習 [2]
- 学習結果で得れれた回帰式の係数と切片を確認 [3]
- 直線回帰式をMatplotlibで可視化 [4]
- MSE値(平均二乗誤差)と\(R^2\)値を確認 [5]
from sklearn import datasets
import pandas as pd
# bostonデータ読み込み
boston = datasets.load_boston()
# RM(部屋数)とPRICE(価格)で回帰分析
X_RM = boston.data[:, [5]] # RM(部屋数)
y_PRICE = boston.target # target(価格)
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰
# RMとPRICEの全データで学習
clf.fit(X_RM, y_PRICE)
# 学習で求められた回帰式(ax+b)の切片と係数を確認
a = clf.coef_ # 係数
b = clf.intercept_ # 切片
print('coefficient a = ', a)
print('intercept b = ', b)
# 回帰式をグラフで可視化
%matplotlib inline
import matplotlib.pyplot as plt
plt.xkcd() # 手書き風
plt.scatter(X_RM, y_PRICE, c='gray', alpha=0.5) # データプロット
lreg_y = a * X_RM + b # clf.predict(X_RM)の出力値と同じ
plt.plot(X_RM, lreg_y, 'r') # 回帰直線プロット
plt.ylabel('Price in $1,000s')
plt.xlabel('Number of rooms')
plt.title('Boston house-prices')
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
y_pred = clf.predict(X_RM)
mse = mean_squared_error(y_PRICE, y_pred)
print('MSE = ', mse)
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)
print('R^2 = ', clf.score(X_RM, y_PRICE))
説明変数を全て使って重回帰分析
次は、13種類の説明変数(特徴)を全て利用して重回帰分析を行います。
- データセット読み込み、説明変数(全て)と目的変数(価格)変数に代入 [1]
- モデル(LinearRegression)の作成と学習 [2]
- 学習結果で得れれた重回帰式の係数(13個)と切片を確認 [3,4]
- MSE値(平均二乗誤差)と\(R^2\)値を確認 [5,6]
from sklearn import datasets
import pandas as pd
# bostonデータ読み込み
boston = datasets.load_boston()
X_ALL = boston.data # 全13種類
y_PRICE = boston.target # target(価格)
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰
# RMとPRICEの全データで学習
clf.fit(X_ALL, y_PRICE)
重回帰式
\[y = b + a_0 x_0 + a_1 x_1 + \dots + a_{12} x_{12}\]
# 重回帰式の切片
print('intercept b = ', clf.intercept_)
# 重回帰式の係数
import pandas as pd
coef_df = pd.DataFrame(boston.feature_names, columns=['Feature'])
coef_df['coefficient'] = pd.Series(clf.coef_)
coef_df
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
y_pred = clf.predict(X_ALL)
mse = mean_squared_error(y_PRICE, y_pred)
print('MSE = ', mse)
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)
print('R^2 = ', clf.score(X_ALL, y_PRICE))
単回帰分析のときより、MSE値が小さく\(R^2\)値も向上しています。
訓練データとテストデータに分割して重回帰分析(モデル検証)
最後に、訓練データとテストデータに分割してモデルの検証を行います。
- データセット読み込み[1]
- 訓練データとテストデータ(default=25%)に分割 [2]
- 訓練データとテストデータの件数確認 [3]
- モデル(LinearRegression)の作成と訓練データで学習 [4]
- MSE値(平均二乗誤差)と\(R^2\)値を確認 [5,6]
from sklearn import datasets
import pandas as pd
# bostonデータ読み込み
boston = datasets.load_boston()
# Bostonデータを訓練データとテストデータに分割(default=25%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
boston.data, boston.target, random_state=0)
# 分割後のデータ件数
print('train = ', len(X_train))
print('test =', len(X_test))
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰
# 訓練データ(75%)で学習
clf.fit(X_train, y_train)
# テストデータ(25%)でモデルを検証
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
pred = clf.predict(X_test)
mse = mean_squared_error(y_test, pred)
print('MSE = ', mse)
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)
print('R^2 = ', clf.score(X_test, y_test))
ボストン住宅価格データを使った回帰分析は以上です。
0 件のコメント :
コメントを投稿