線形回帰④ (重回帰モデルの精度評価)

前回構築した重回帰モデルの精度評価を行います。

散布図

散布図で予測結果を可視化してみます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
%matplotlib inline

print(X_train.shape)
print(y_train_pred.shape)
#plt.scatter(X_train, y_train_pred, label="train") # ValueError: x and y must be the same size
#plt.scatter(X_test, y_test_pred, label="test") # ValueError: x and y must be the same size
plt.xlabel("X")
plt.ylabel("y")
plt.title("multi_reg")
plt.legend()
plt.show()

エラーが発生したため、6~7行目をコメントアウトしました。

ValueError: x and y must be the same sizeというエラーメッセージは引数にしている変数の次元数が同じではないために発生したエラーになります。

単回帰のように説明変数と目的変数が1つずつであれば散布図で表示することができますが、今回の重回帰では説明変数が13種類あるので散布図では表示できません。

[実行結果]

という訳で予測結果を散布図で表示するのは省略します。

残差プロット

残差プロットで予測結果を可視化します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
def residual_plot(y_train_pred, y_train, y_test_pred, y_test):
plt.scatter(y_train_pred, y_train_pred - y_train, label="train")
plt.scatter(y_test_pred, y_test_pred - y_test, label="test")
plt.plot([0, 50], [0,0] ,color="red")
plt.xlabel("Pred")
plt.ylabel("Pred - True")
plt.title("Residual Plot")
plt.legend()
plt.show()

residual_plot(y_train_pred, y_train, y_test_pred, y_test)

[実行結果]

外れ値はあるようですが、単回帰の時ほど値は大きくなく、密集部分の範囲も±10程度に収まっており精度が改善しています。

精度評価スコア

精度評価スコアを算出します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np

def get_eval_score(y_true,y_pred):
mae = mean_absolute_error(y_true,y_pred)
mse = mean_squared_error(y_true,y_pred)
rmse = np.sqrt(mse)
r2score = r2_score(y_true,y_pred)

print(f" MAE = {mae}")
print(f" MSE = {mse}")
print(f" RMSE = {rmse}")
print(f" R2 = {r2score}")

print("訓練データスコア")
get_eval_score(y_train,y_train_pred)
print("テストデータスコア")
get_eval_score(y_test,y_test_pred)

[実行結果]

十分高い精度とはいきませんでしたが、テストデータのR2スコアが0.67と単回帰よりもかなり改善しています。

また、過学習の傾向もないようです。