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.")