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)
コメント