ボストン市の住宅価格を線形回帰で予測する
教師あり学習である回帰を利用して実際のデータを予測しましょう。
from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt # ボストン市の住宅価格 boston = load_boston() # データフレームに変換 df = pd.DataFrame(boston.data, columns=boston.feature_names) df["PRICE"] = boston.target df.head()
データの意味は以下の表に書いてあります。
# データ間の相関係数を求める corr_mat = df.corr(method="pearson") # ヒートマップで可視化 sns.heatmap(corr_mat, vmax=1, vmin=-1, center=0, annot=True, fmt=".1f")
# RM(部屋の数)と価格のヒストグラムと散布図を表示 sns.pairplot(df[["RM", "PRICE"]])
# 部屋の数を変数x, 価格を変数yに保存 x = df["RM"] y = df["PRICE"] # 列ベクトルに変換 x = np.array(x).reshape(-1,1) y = np.array(y).reshape(-1,1) # 訓練データとテストデータに分割 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0) # モデルの学習 model = LinearRegression() model.fit(x_train, y_train) # 係数の確認 a = model.coef_ b = model.intercept_ print("coefficient a = %f" % a) print("intercept b = %f" % b)
coefficient a = 9.311328
intercept b = -35.994349
y_train_pred = model.predict(x_train) plt.scatter(x_train, y_train) plt.plot(x_train, y_train_pred, "r", lw=3) plt.ylabel("PRICE") plt.xlabel("NUMBER OF ROOMS")
# 訓練データの平均平方二乗誤差を求める print("RMSE train : %f" % np.sqrt(mean_squared_error(y_train, y_train_pred)))
RMSE train : 6.492892
y_test_pred = model.predict(x_test) plt.scatter(x_test, y_test) plt.plot(x_test, y_test_pred, "r", lw=3) plt.ylabel("PRICE") plt.xlabel("NUMBER OF ROOMS")
# 訓練データの平均平方二乗誤差を求める print("RMSE train : %f" % np.sqrt(mean_squared_error(y_test, y_test_pred)))
RMSE train : 6.858064
価格は1000ドル単位なので、約7000ドルほど誤差があるようです。
今回は部屋の数のみ考慮しましたが、他の変数も考慮すれば、精度が向上する可能性はあるでしょう。