機械学習回帰編 改良版モデルの構築

import numpy as np
import pandas as pd
import pandas_profiling as pdp
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import 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.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import LabelEncoder
import xgboost as xbg
import lightgbm as lgb
import warnings
warnings.simplefilter('ignore')
with open('imp_data.csv', mode='rb') as f:
    imp_data=pickle.load(f)

データの分割 ランダムフォレスト

y_target = imp_data['price']
col=imp_data.columns.tolist()
col.remove('price')
x_explanatory=imp_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)
rf_pred = rf_model.predict(x_test)
rf_pred
X=mean_abosolute_error(y_test, rf_pred)
print('ランダムフォレストモデルの平均絶対誤差は', X)
Y=r2_score(y_test, rf_pred)
print('ランダムフォレストモデルの決定係数は',Y)
ランダムフォレストモデルの平均絶対誤差は 1127.6563752017605
ランダムフォレストモデルの決定係数は 0.8839401954051774

学習結果の可視化

散布図の作成

fig=plt.figure(figsize=(6,5))

plt.scatter(y_test, rf_pred, color='blue')
x=np.arange(0,40000)
plt.plot(x,x,color='red')
plt.title('predicted_data & test_data')
plt.xlabel('test_data')
plt.ylabel('predicted_data')

plt.show()

残差プロット

plt.scatter(rf_pred, rf_pred-y_test, color='blue')
plt.hlines(y=0, xmin=-2000, xmax=38000, color='black')
plt.title('Residual Plot')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.grid()

plt.show()

feature_importances_

features = x_train.columns
importances = rf_mode.feature_importances_
indices=np.argsort(importances)

plt.figure(figsize=(6,5))
plt.barh(range(len(indices)), importances[indices], alin='center')
plt.yticks(range(len(indices)), features[indices])
plt.show() 

ブースティングによるモデル構築

xgb_model=xgb.XGBRegressor()
xgb_model.fit(x_train, y_train)

XGBRegressor(base_score=0.5, booster=’gbtree’, callbacks=None,
colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1,
early_stopping_rounds=None, enable_categorical=False,
eval_metric=None, gamma=0, gpu_id=-1, grow_policy=’depthwise’,
importance_type=None, interaction_constraints=”,
learning_rate=0.300000012, max_bin=256, max_cat_to_onehot=4,
max_delta_step=0, max_depth=6, max_leaves=0, min_child_weight=1,
missing=nan, monotone_constraints='()’, n_estimators=100, n_jobs=0,
num_parallel_tree=1, predictor=’auto’, random_state=0, reg_alpha=0,
reg_lambda=1, …)

xgb_pred= xgb_model.predict(x_test)
xgb_pred
X = mean_absolute_error(y_test, xgb_pred)
print("XGBoostモデルの平均絶対誤差は",X)
Y = r2_score(y_test, xgb_pred)
print("XGBoostモデルの決定係数は",Y)
XGBoostモデルの平均絶対誤差は 1197.7050664986243
XGBoostモデルの決定係数は 0.8796875110181551
fig = plt.figure(figsize=(10,24))

ax1 = fig.add_subplot(3,1,1)
plt.scatter(y_test, xgb_pred, color='blue')
x=np.arrange(0,40000)
plt.plot(x,x,color='red')
plt.title('predicted_data & test_data')
plt.xlable('test_data')
plt.ylabel('predicted_data')

ax2=fig.add_subplot(3,1,2)
plt.scatter(xgb_pred, xgb_pred-y_test, color='blue')
plt.hlines(y=0, xmin=-2000, xmax=38000, color='black')
plt.title('Residual_Plot')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.grid()

ax3=fig.add_subplot(3,1,3)
features=x_train.columns
importances=xgb_model.feature_importances_
indices=np.argsort(importances)
plt.barh(range(len(indices)), importances[indices], align='center')
plt.yticks(range(len(indices)), features[indices])
plt.title('feature_importanes')
plt.xlabel('importances')
plt.ylabel('freature')

plt.show

LightGBMによる学習、評価

lgb_train=lgb.Dataset(x_train, y_train)
lgb_eval=lgb.Dataset(x_test,y_test)

そして、ハイパーパラメータを設定する必要があります。

様々なハイパーパラメータがありますが、metricとmax_depthさえ設定すればOKです。

metric:誤差関数の測定方法。回帰ならmse、分類ならbinary_error等を用いる。
max_depth:決定木の最大の深さ。深さを増やすと学習率が上がるが、学習に時間がかかる。7程度が一般的。

params={'metric':{'mse'}, 'max_depth':7}

パラメータを設定したら、.train()で学習を開始します。

第1引数にパラメータ、第2引数に学習データ、第3引数に検証データを入力します。

gbm_model=lgb.train(params,lgb_train, valid_sets=(lgb_train, lgb_eval))
gbm_pred = gbm_model.predict(x_test)
X=mean_absolute_error(y_test, gbm_pred)
print("LightGBMモデルの平均絶対誤差は",X)
Y=r2_score(y_test, gbm_pred)
print("LightGBMモデルの決定係数は",Y)

LightGBMモデルの平均絶対誤差は 1282.1666622730315
LightGBMモデルの決定係数は 0.8654060792126969

fig=plt.figure(figsize=(10,24)

ax1=fig.add_subplot(3,1,1)
plt.scatter(y_test, gbm_pred, color='blue')
x=np.arange(0,40000)
plt.plot(x,x,color='red')
plt.title('predicted_data & test_data')
plt.xlabel('test_data')
plt.ylabel('predicted_data')

ax2=fig.add_subplot(3,1,2)
plt.scatter(gbm_pred, gbm_pred-y_test, color='blue')
plt.hlines(y=0,xmin=-2000, xmax=38000, color='black')
plt.title('Residual Plot')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.grid()

ax3=fig.add_subplot(3,1,3)
features=x_train.columns
importances=gbm_model.feature_importances_
indices=np.argsort(importances)
plt.barh=(range(len(indices)), importances[indices], align='center')
plt.yticks=(range(len(indices)), features[indices])
plt.title('feature_importances')
plt.xlabel('importances')
plt.ylabel('feature')

plt.show()
with open('rf_model.text', mode='wb') as f:
  pickle.dump(rf_model, f)

with open('xgb_model.text', mode='wb') as f:
  pickel.dump(xgb_model, f)

with open ('gbm_model.text', mode='wb') as f:
  pickel.dump(gbm_model, f)

コメント

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