haizad's picture
Improve formatting
079c1db
import gradio as gr
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.multioutput import MultiOutputRegressor
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
def compare(max_depth,n_estimators):
rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(600, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y += 0.5 - rng.rand(*y.shape)
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=400, test_size=200, random_state=4
)
regr_multirf = MultiOutputRegressor(
RandomForestRegressor(n_estimators=n_estimators, max_depth=max_depth, random_state=0)
)
regr_multirf.fit(X_train, y_train)
regr_rf = RandomForestRegressor(n_estimators=n_estimators, max_depth=max_depth, random_state=2)
regr_rf.fit(X_train, y_train)
# Predict on new data
y_multirf = regr_multirf.predict(X_test)
y_rf = regr_rf.predict(X_test)
# Plot the results
fig, ax = plt.subplots()
s = 50
a = 0.4
ax.scatter(
y_test[:, 0],
y_test[:, 1],
edgecolor="k",
c="navy",
s=s,
marker="s",
alpha=a,
label="Data",
)
ax.scatter(
y_multirf[:, 0],
y_multirf[:, 1],
edgecolor="k",
c="cornflowerblue",
s=s,
alpha=a,
label="Multi RF score=%.2f" % regr_multirf.score(X_test, y_test),
)
ax.scatter(
y_rf[:, 0],
y_rf[:, 1],
edgecolor="k",
c="c",
s=s,
marker="^",
alpha=a,
label="RF score=%.2f" % regr_rf.score(X_test, y_test),
)
ax.set_xlim([-6, 6])
ax.set_ylim([-6, 6])
ax.set_xlabel("target 1")
ax.set_ylabel("target 2")
ax.set_title("Comparing random forests and the multi-output meta estimator")
ax.legend()
return fig
title = "Comparing random forests and the multi-output meta estimator"
with gr.Blocks(title=title) as demo:
gr.Markdown(f"## {title}")
gr.Markdown("""
This app demonstrates comparison of random forest with multi-output meta estimator for multi-output regression.
A random forest regressor is trained on randomly generated data which is used as baseline and compared with multi-output meta estimator trained on the same dataset.
The predicted outputs from each model are visualized in the plot together with the actual data.
The maximum depth and number of estimator of the random forest can be adjusted and the effect can be seen in the resulting plot.
This app is developed based on [scikit-learn example](https://scikit-learn.org/stable/auto_examples/ensemble/plot_random_forest_regression_multioutput.html#sphx-glr-auto-examples-ensemble-plot-random-forest-regression-multioutput-py)
""")
max_depth = gr.Slider(minimum=10, maximum=50, step=1, label = "Maximum Depth")
n_estimators = gr.Slider(minimum=50, maximum=300, step=1, label = "Number of Estimators")
plot = gr.Plot(label=title)
n_estimators.change(fn=compare, inputs=[max_depth,n_estimators], outputs=[plot])
max_depth.change(fn=compare, inputs=[max_depth,n_estimators], outputs=[plot])
demo.launch()