#============================================================
#Classificador de Flores Iris — Aprendizado Supervisionado
#============================================================
#── ETAPA 1: Carregar e explorar os dados ───────────────────
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['especie'] = pd.Categorical.from_codes(iris.target, iris.target_names)
print("=== Primeiras linhas do dataset ===")
print(df.head(10))
print("\n=== Informações gerais ===")
print(df.info())
print("\n=== Estatísticas descritivas ===")
print(df.describe())
print("\n=== Distribuição das espécies ===")
print(df['especie'].value_counts())
#── ETAPA 2: Pré-processar os dados ─────────────────────────
from sklearn.model_selection import train_test_split
X = iris.data # atributos (sépalas e pétalas)
y = iris.target # rótulos (0 = setosa, 1 = versicolor, 2 = virginica)
X_treino, X_teste, y_treino, y_teste = train_test_split(
X, y,
test_size=0.2, # 20% para teste
random_state=42, # semente para reprodutibilidade
stratify=y # mantém proporção das classes
)
print(f"\nTamanho do conjunto de treino : {X_treino.shape[0]} amostras")
print(f"Tamanho do conjunto de teste : {X_teste.shape[0]} amostras")
#── ETAPA 3: Treinar o modelo ────────────────────────────────
from sklearn.tree import DecisionTreeClassifier
modelo = DecisionTreeClassifier(
max_depth=4, # limita profundidade para evitar overfitting
random_state=42
)
modelo.fit(X_treino, y_treino)
print("\nModelo treinado com sucesso!")
#── ETAPA 4: Avaliar o desempenho ────────────────────────────
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import cross_val_score
import numpy as np
#Previsões no conjunto de teste
y_pred = modelo.predict(X_teste)
#Acurácia simples
acuracia = accuracy_score(y_teste, y_pred)
print(f"\n=== Acurácia no conjunto de teste: {acuracia:.2%} ===")
#Relatório detalhado por classe
print("\n=== Relatório de Classificação ===")
print(classification_report(y_teste, y_pred, target_names=iris.target_names))
#Matriz de confusão
print("=== Matriz de Confusão ===")
cm = confusion_matrix(y_teste, y_pred)
cm_df = pd.DataFrame(cm, index=iris.target_names, columns=iris.target_names)
print(cm_df)
#Validação cruzada (5 folds)
scores = cross_val_score(modelo, X, y, cv=5, scoring='accuracy')
print(f"\n=== Validação Cruzada (5 folds) ===")
print(f"Acurácias por fold : {[f'{s:.2%}' for s in scores]}")
print(f"Média : {scores.mean():.2%}")
print(f"Desvio padrão : {scores.std():.2%}")
#── ETAPA 5: Testar com novas amostras ──────────────────────
print("\n=== Teste com novas amostras ===")
#Formato: [comp_sepala, larg_sepala, comp_petala, larg_petala] — em cm
novas_flores = [
[5.1, 3.5, 1.4, 0.2], # provavelmente Setosa
[6.3, 3.3, 4.7, 1.6], # provavelmente Versicolor
[7.2, 3.0, 5.8, 1.6], # provavelmente Virginica
]
previsoes = modelo.predict(novas_flores)
probabilidades = modelo.predict_proba(novas_flores)
for i, (flor, pred, prob) in enumerate(zip(novas_flores, previsoes, probabilidades), 1):
especie = iris.target_names[pred]
confianca = prob[pred]
print(f"\nAmostra {i}: {flor}")
print(f" → Espécie prevista : {especie} (confiança: {confianca:.0%})")
print(f" Setosa={prob[0]:.0%} Versicolor={prob[1]:.0%} Virginica={prob[2]:.0%}")