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