beas_space / app.py
beatrizpm's picture
Upload 3 files
8db92d9 verified
import streamlit as st
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
st.set_page_config(page_title="🌸 Iris Playground", page_icon="🌸")
st.title("🌸 Iris ML Playground — zero upload, 100% diversão!")
st.caption("Treinamos um modelo **na hora** usando o dataset Iris do scikit-learn. Ajuste os controles e veja a predição ao vivo.")
# Load dataset
data = load_iris()
X, y = data.data, data.target
feature_names = data.feature_names
target_names = data.target_names
with st.sidebar:
st.header("⚙️ Configurações do Modelo")
model_name = st.selectbox("Algoritmo", ["k-NN (K Vizinhos)", "Random Forest"])
if model_name.startswith("k-NN"):
k = st.slider("k (nº de vizinhos)", 1, 15, 5, 1)
model = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=k))
else:
n = st.slider("Árvores (n_estimators)", 10, 300, 150, 10)
model = RandomForestClassifier(n_estimators=n, random_state=42)
st.divider()
st.subheader("📏 Medidas da flor (cm)")
sepal_length = st.slider("Comprimento da Sépala", 4.0, 8.0, 5.8, 0.1)
sepal_width = st.slider("Largura da Sépala", 2.0, 4.5, 3.0, 0.1)
petal_length = st.slider("Comprimento da Pétala", 1.0, 7.0, 4.2, 0.1)
petal_width = st.slider("Largura da Pétala", 0.1, 2.5, 1.3, 0.1)
# Train model (quick!)
scores = cross_val_score(model, X, y, cv=5)
model.fit(X, y)
# Predict
sample = np.array([[sepal_length, sepal_width, petal_length, petal_width]])
proba = None
if hasattr(model, "predict_proba"):
try:
proba = model.predict_proba(sample)[0]
except Exception:
proba = None
pred = model.predict(sample)[0]
name = target_names[pred]
EMOJI = {"setosa":"🌱", "versicolor":"🌿", "virginica":"🌺"}
emoji = EMOJI.get(name, "🌸")
col1, col2 = st.columns(2)
with col1:
st.metric("🎯 Acurácia (CV 5-fold)", f"{scores.mean()*100:,.2f}%")
with col2:
st.metric("📊 Desvio-padrão", f"{scores.std()*100:,.2f}%")
st.success(f"**Predição:** {emoji} **{name.title()}**")
if proba is not None:
st.write("**Confiança por classe:**")
for i, cls in enumerate(target_names):
bar = "▓" * int(proba[i] * 20)
st.write(f"- {cls.title()}: {proba[i]*100:5.1f}% {bar}")
with st.expander("💡 O que está acontecendo aqui?"):
st.markdown(
"""
- Carregamos o dataset **Iris** embutido no `scikit-learn` (sem upload!).
- Treinamos um modelo simples (*k-NN* ou *Random Forest*) **na hora**.
- Você ajusta as medidas da flor e o app **prevê a espécie**.
- Mostramos a **acurácia média** via validação cruzada (CV 5-fold).
- Tudo roda em segundos — perfeito para demonstração em aula.
"""
)
st.caption("Feito com Streamlit • Dataset: Fisher's Iris (via scikit-learn) • Sem arquivos externos.")