ZennyKenny's picture
add visualisation elements
43728f4 verified
raw
history blame
4.11 kB
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names
class_names = iris.target_names
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
def train_and_evaluate(learning_rate, n_estimators, max_depth):
# Train model
clf = GradientBoostingClassifier(
learning_rate=learning_rate,
n_estimators=n_estimators,
max_depth=int(max_depth),
random_state=42
)
clf.fit(X_train, y_train)
# Predict and compute metrics
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
# Convert confusion matrix to readable string
cm_display = "\n".join([str(row) for row in cm])
# Create a feature importance bar chart
importances = clf.feature_importances_
fig, ax = plt.subplots()
ax.barh(range(len(feature_names)), importances, color='skyblue')
ax.set_yticks(range(len(feature_names)))
ax.set_yticklabels(feature_names)
ax.set_xlabel("Importance")
ax.set_title("Feature Importances (Gradient Boosting)")
# Convert the Matplotlib figure to a Gradio-readable format
# (returns a temporary .png file path)
return (
f"Accuracy: {accuracy:.3f}\nConfusion Matrix:\n{cm_display}",
fig
)
def predict_species(sepal_length, sepal_width, petal_length, petal_width,
learning_rate, n_estimators, max_depth):
clf = GradientBoostingClassifier(
learning_rate=learning_rate,
n_estimators=n_estimators,
max_depth=int(max_depth),
random_state=42
)
clf.fit(X_train, y_train)
user_sample = np.array([[sepal_length, sepal_width, petal_length, petal_width]])
prediction = clf.predict(user_sample)[0]
return f"Predicted species: {class_names[prediction]}"
with gr.Blocks() as demo:
with gr.Tab("Train & Evaluate"):
gr.Markdown("## Train a GradientBoostingClassifier on the Iris dataset")
learning_rate_slider = gr.Slider(0.01, 1.0, value=0.1, step=0.01, label="learning_rate")
n_estimators_slider = gr.Slider(50, 300, value=100, step=50, label="n_estimators")
max_depth_slider = gr.Slider(1, 10, value=3, step=1, label="max_depth")
train_button = gr.Button("Train & Evaluate")
output_text = gr.Textbox(label="Results")
output_plot = gr.Plot(label="Feature Importance")
train_button.click(
fn=train_and_evaluate,
inputs=[learning_rate_slider, n_estimators_slider, max_depth_slider],
outputs=[output_text, output_plot],
)
with gr.Tab("Predict"):
gr.Markdown("## Predict Iris Species with GradientBoostingClassifier")
sepal_length_input = gr.Number(value=5.1, label=feature_names[0])
sepal_width_input = gr.Number(value=3.5, label=feature_names[1])
petal_length_input = gr.Number(value=1.4, label=feature_names[2])
petal_width_input = gr.Number(value=0.2, label=feature_names[3])
learning_rate_slider2 = gr.Slider(0.01, 1.0, value=0.1, step=0.01, label="learning_rate")
n_estimators_slider2 = gr.Slider(50, 300, value=100, step=50, label="n_estimators")
max_depth_slider2 = gr.Slider(1, 10, value=3, step=1, label="max_depth")
predict_button = gr.Button("Predict")
prediction_text = gr.Textbox(label="Prediction")
predict_button.click(
fn=predict_species,
inputs=[
sepal_length_input,
sepal_width_input,
petal_length_input,
petal_width_input,
learning_rate_slider2,
n_estimators_slider2,
max_depth_slider2,
],
outputs=prediction_text
)
demo.launch()