from sklearn.ensemble import RandomForestRegressor

forest = RandomForestRegressor()
forest.fit(X_train, y_train);

# Plot forest model

fig, axs =  plt.subplots(2,2, figsize=(10,10))
axs = iter(axs.reshape(1, -1)[0])

# Plotting of the train dataset
ax = next(axs)
y_hat_train = pd.Series(forest.predict(X_train), index=y_train.index).sort_values()
sns.scatterplot(x=np.expm1(y_hat_train), y=np.expm1(y_train), marker= 'o', s=50, alpha=0.8, ax=ax)
ax.set(ylabel='Real value',
       xlabel='Predicted value',
	   title=f'Random Forest Regressor\\nTrain Dataset - R²={forest.score(X_train, y_train):.3f}'
)

# Plotting of the test dataset
ax = next(axs)
y_hat = pd.Series(forest.predict(X_test), index=X_test.index).sort_values()
sns.scatterplot(x=np.expm1(y_hat), y=np.expm1(y_test_log.loc[y_hat.index]), marker= 'o', s=50, alpha=0.8, ax=ax)
ax.set(ylabel='Real value',
       xlabel='Predicted value',
	   title=f'Random Forest Regressor\\nTest Dataset - R²={forest.score(X_test, y_test_log):.3f}'
)

# Plotting of residuals

ax = next(axs)
sorted_y_test = y_test_log.sort_values()
sorted_x_test = X_test.reindex(sorted_y_test.index)
predicted_values = np.expm1(best_regressor.model.predict(sorted_x_test))
residuals = (np.expm1(sorted_y_test) - predicted_values)
sns.scatterplot(x=predicted_values, y=residuals, ax=ax)
ax.set(ylabel='Residuals',
       xlabel='Predicted value',
	   title=f'Residuals'
);

# Plotting of residuals Histogram

ax = next(axs)
sns.histplot(data=residuals, ax=ax, kde=True)
ax.set(ylabel='Residual count',
       xlabel='Predicted value',
	   title=f'Residuals histogram'
);