ボストン市の住宅価格を線形回帰で予測する

教師あり学習である回帰を利用して実際のデータを予測しましょう。

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()

データの意味は以下の表に書いてあります。

引用:https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88

# データ間の相関係数を求める
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ドルほど誤差があるようです。

今回は部屋の数のみ考慮しましたが、他の変数も考慮すれば、精度が向上する可能性はあるでしょう。

ikunobu
機械学習