機械学習回帰編 学習、検証データ

import numpy as np
import pandas as pd
import pandas_profiling as pdp
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d as Axes3D
import seaborn as sns
import pickle
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error
import xgboost as xgb
import lightgbm as lgb
import warnings
warnings.simplefilter('ignore')

準備データの読み込み

csvDataPath = 'autos.csv'
data=pd.read_csv(csvDataPath, encoding='cp1252')
num_data=data.select_dtypes(include='int64')
obj_data = data.select_dtypes(include='object')
lostlist=obj_data.columns[obj_data.isnull().sum()!=0]
complist=obj_data.columns[obj_data.isnull().sum()=0]
lost_obj_data=obj_data[lostlist]
comp_obj_data=obj_data[complist]

変数の準備

y_target= num_data['price']

num_dataのみで分析

col = num_data.columns.tolist()
col.remove('price')
print(col)
['yearOfRegistration', 'powerPS', 'kilometer', 'monthOfRegistration', 'nrOfPictures', 'postalCode']

このとき、num_dataには目的変数のpriceも含まれるので、きちんと取り除きましょう。

x_explanatory = num_data[col]
x_train, x_test, y_train, y_test = train_test_split(x_explanatory, y_target, random_state=1)

ランダムフォレスト

rf_model=RandomForestRegressor()
rf_model.fit(x_train,y_train)
RandomForestRegressor()
rf_pred=rf_model.predict(x_test)
rf_pred

モデルの評価

mean_absolute_error(y_test, rf_pred)
41586.923570055835
r2_score(y_test, rf_pred)
-0.003948600537527325

予測値と正解値の比較

モデルの精度を可視化するには、予測データと検証データを比較するのが一番手軽です。散布図関数plt.scatter()を使ってプロットしてみましょう。
x軸,y軸の順でデータを入力します。

plt.scatter(y_test, rf_pred)
plt.title("predicted_data & test_data")
plt.xlabel("test_data")
plt.ylabel("predicted_data")

plt.glid(True)

 残差プロットの作成


もう1つ、モデルの精度の可視化として、「残差プロット」という散布図があります。

これは横軸に説明変数または予測データをとり、縦軸に回帰残差(予測データと検証データの差分)をとってプロットしたものです。

回帰結果に何らかの規則性や分散の偏りがあるか、等を判断することができます。

plt.scatter(rf_pred, rf_pred - y_test, color = 'blue')      # 残差をプロット 
plt.hlines(y = 0, xmin = min(rf_pred), xmax = max(rf_pred), color = 'black') # x軸に沿った直線をプロット
plt.title('Residual Plot')                                # 図のタイトル
plt.xlabel('Predicted Values')                            # x軸のラベル
plt.ylabel('Residuals')                                   # y軸のラベル
plt.grid()                                                # グリッド線を表示
plt.show()                                               # 図の表示

左下に、明らかに予測に失敗している値が見えますね。

ここまでで、モデルの学習・予測結果を数値とグラフで可視化してきました。

勘の良い方は、評価指標の時点で想像がついていたと思いますが…

量的変数のみを用いた今回のモデルは、非常に精度が悪いです。

次のノートで、どのようにすれば改善できるか、一緒に考えていきましょう。

7.6 pickleを用いてモデルの保存


最後に、比較のためにモデルを保存する方法を解説します。

【Point】

  • pickleはPythonオブジェクトをファイルとして保存し、必要に応じて呼び出すためのパッケージです。
  • 機械学習に限らずAIのモデル開発では、学習したモデルを保存し、後から呼び出すことが頻繁にあります。
with open('rf_model.pkl', mode='wb') as f:
    pickle.dump(rf_model, f)

コメント

タイトルとURLをコピーしました