from __future__ import annotations import numpy as np import gradio as gr import plotly.graph_objects as go from sklearn.datasets import load_diabetes from sklearn.ensemble import GradientBoostingRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.linear_model import LinearRegression from sklearn.ensemble import VotingRegressor def plot_votes(preds: list[tuple[str, np.array]], markers: list[str]=None) -> go.Figure: fig = go.Figure() for idx, (name, pred) in enumerate(preds): if not markers: symbol = "diamond" else: symbol = markers[idx] fig.add_trace( go.Scatter( y=pred, mode="markers", name=name, marker=dict(symbol=symbol, size=10, line=dict(width=2, color="DarkSlateGrey")) ) ) fig.update_layout( title="Regressor predictions and their average", yaxis_title="Predicted", xaxis_title="Training Samples", height=500, xaxis=dict(showticklabels=False), hovermode="x unified" ) return fig def app_fn(n: int) -> go.Figure: X, y = load_diabetes(return_X_y=True) # Train classifiers reg1 = GradientBoostingRegressor(random_state=1) reg2 = RandomForestRegressor(random_state=1) reg3 = LinearRegression() reg1.fit(X, y) reg2.fit(X, y) reg3.fit(X, y) ereg = VotingRegressor([("gb", reg1), ("rf", reg2), ("lr", reg3)]) ereg.fit(X, y) xt = X[:n] pred1 = reg1.predict(xt) pred2 = reg2.predict(xt) pred3 = reg3.predict(xt) pred4 = ereg.predict(xt) preds = [ ("Gradient Boosting", pred1), ("Random Forest", pred2), ("Linear Regression", pred3), ("Voting Regressor", pred4) ] markers = ["diamond-tall", "triangle-up", "square", "star"] fig = plot_votes(preds, markers) return fig title="Individual and Voting Regression Predictions 🗳️" with gr.Blocks() as demo: gr.Markdown(f"# {title}") gr.Markdown( """ A voting regressor is an ensemble meta-estimator that fits several base regressors, each on the whole dataset. \ Then it averages the individual predictions to form a final prediction. This example will use three different regressors to \ predict the data: GradientBoostingRegressor, RandomForestRegressor, and LinearRegression. Then the 3 regressors will be used for the VotingRegressor. \ The dataset used consists of 10 features collected from a cohort of diabetes patients. The target is a quantitative measure of disease progression one year after baseline. [Original example](https://scikit-learn.org/stable/auto_examples/ensemble/plot_voting_regressor.html#sphx-glr-auto-examples-ensemble-plot-voting-regressor-py) """ ) n = gr.inputs.Slider(10, 30, 5, 20, "Number of training samples") plot = gr.Plot(label="Individual & Voting Predictions") n.change(fn=app_fn, inputs=[n], outputs=[plot]) demo.load(fn=app_fn, inputs=[n], outputs=[plot]) demo.launch()