Spaces:
Sleeping
Sleeping
File size: 5,890 Bytes
cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e cf7215e 921471e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import numpy as np
import plotly.graph_objects as go
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification, make_blobs
from sklearn.neural_network import MLPClassifier
import gradio as gr
# =========================================================================
GRANULARITY = 0.2
MARGIN = 0.5
N_SAMPLES = 150
SEED = 1
datasets = {}
X, y = make_moons(n_samples=N_SAMPLES, noise=0.2, random_state=SEED)
X = StandardScaler().fit_transform(X)
datasets["Moons"] = (X.copy(), y.copy())
X, y = make_circles(n_samples=N_SAMPLES, noise=0.2, factor=0.5, random_state=SEED)
X = StandardScaler().fit_transform(X)
datasets["Circles"] = (X.copy(), y.copy())
X, y = make_blobs(n_samples=N_SAMPLES, n_features=2, centers=4, cluster_std=2, random_state=SEED)
X = StandardScaler().fit_transform(X)
y[y==2] = 0
y[y==3] = 1
datasets["Blobs"] = (X.copy(), y.copy())
X, y = make_classification(n_samples=N_SAMPLES, n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1, random_state=SEED)
X += 2 * np.random.uniform(size=X.shape)
X = StandardScaler().fit_transform(X)
datasets["Linear"] = (X.copy(), y.copy())
# =========================================================================
def get_figure_dict():
figure_dict = dict(data=[], layout={}, frames=[])
play_button = dict(args=[None, {"mode": "immediate", "fromcurrent": False, "frame": {"duration": 50}, "transition": {"duration": 50}}],
label="Play",
method="animate")
pause_button = dict(args=[[None], {"mode": "immediate"}],
label="Stop",
method="animate")
slider = dict(steps=[], active=0, currentvalue={"prefix": "Iteration: "})
figure_dict["layout"] = dict(width=600, height=600, hovermode=False, margin=dict(l=40, r=40, t=40, b=40),
title=dict(text="Decision Surface", x=0.5),
sliders=[slider],
updatemenus=[dict(buttons=[play_button, pause_button], direction="left", pad={"t": 85}, type="buttons", x=0.6, y=-0.05)]
)
return figure_dict
def get_decision_surface(X, model):
x_min, x_max = X[:, 0].min() - MARGIN, X[:, 0].max() + MARGIN
y_min, y_max = X[:, 1].min() - MARGIN, X[:, 1].max() + MARGIN
xrange = np.arange(x_min, x_max, GRANULARITY)
yrange = np.arange(y_min, y_max, GRANULARITY)
x, y = np.meshgrid(xrange, yrange)
x = x.ravel(); y = y.ravel()
z = model.predict_proba(np.column_stack([x, y]))[:, 1]
return x, y, z
# =========================================================================
def create_plot(dataset, alpha, h1, h2, seed):
X, y = datasets[dataset]
model = MLPClassifier(alpha=alpha, max_iter=2000, learning_rate_init=0.01, hidden_layer_sizes=[h1, h2], random_state=seed)
figure_dict = get_figure_dict()
model.partial_fit(X, y, classes=[0, 1])
xx, yy, zz = get_decision_surface(X, model)
figure_dict["data"] = [go.Contour(x=xx, y=yy, z=zz, opacity=0.6, showscale=False,),
go.Scatter(x=X[:, 0], y=X[:, 1], mode="markers", marker_color=y, marker={"colorscale": "jet", "size": 8})]
prev_loss = np.inf
tol = 3e-4
for i in range(100):
for _ in range(3):
model.partial_fit(X, y, classes=[0, 1])
if prev_loss - model.loss_ <= tol: break
prev_loss = model.loss_
xx, yy, zz = get_decision_surface(X, model)
figure_dict["frames"].append({"data": [go.Contour(x=xx, y=yy, z=zz, opacity=0.6, showscale=False)], "name": i})
slider_step = {"args": [[i], {"mode": "immediate"}], "method": "animate", "label": i}
figure_dict["layout"]["sliders"][0]["steps"].append(slider_step)
fig = go.Figure(figure_dict)
return fig
info = '''
# Effect of Regularization Parameter of Multilayer Perceptron
This example demonstrates the effect of varying the regularization parameter (alpha) of a multilayer perceptron on the binary classification of toy datasets, as represented by the decision surface of the classifier.
Higher values of alpha encourages smaller weights, thus making the model less prone to overfitting, while lower values may help against underfitting. Use the slider below to control the amount of regularization and observe how the decision surface changes with higher values.
The neural network is trained until the loss stops decreasing below a specific tolerance. The color of the decision surface represents the probability of observing the corresponding class.
Created by [@huabdul](https://huggingface.co/huabdul) based on [scikit-learn docs](https://scikit-learn.org/stable/auto_examples/neural_networks/plot_mlp_alpha.html).
'''
with gr.Blocks(analytics_enabled=False) as demo:
with gr.Row():
with gr.Column():
gr.Markdown(info)
dd_dataset = gr.Dropdown(list(datasets.keys()), value="Moons", label="Dataset", interactive=True)
with gr.Row():
with gr.Column(min_width=100):
s_alpha = gr.Slider(0, 4, value=0.1, step=0.05, label="α (regularization parameter)")
s_seed = gr.Slider(1, 1000, value=1, step=1, label="Seed")
with gr.Column(min_width=100):
s_h1 = gr.Slider(2, 20, value=10, step=1, label="Hidden layer 1 size")
s_h2 = gr.Slider(2, 20, value=10, step=1, label="Hidden layer 2 size")
submit = gr.Button("Submit")
with gr.Column():
plot = gr.Plot(show_label=False)
submit.click(create_plot, inputs=[dd_dataset, s_alpha, s_h1, s_h2, s_seed], outputs=[plot])
demo.load(create_plot, inputs=[dd_dataset, s_alpha, s_h1, s_h2, s_seed], outputs=[plot])
demo.launch() |