# Classificador do dataset Iris com aprendizado supervisionado (KNN)
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# 1 - Carregar e explorar os dados
iris = datasets.load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['especie'] = [iris.target_names[i] for i in iris.target]
print("Primeiras linhas do dataset:")
print(df.head())
print("\nInformações gerais:")
print(df.describe())
# 2 - Pré-processar os dados
X = df[iris.feature_names] # atributos (medidas das flores)
y = iris.target # rótulos (0, 1 ou 2)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 3 - Treinar o modelo (K-Nearest Neighbors)
modelo = KNeighborsClassifier(n_neighbors=5)
modelo.fit(X_train, y_train)
# 4 - Avaliar o desempenho do modelo
y_pred = modelo.predict(X_test)
acuracia = accuracy_score(y_test, y_pred)
print(f"\nAcurácia no conjunto de teste: {acuracia:.2f}")
print("\nRelatório de classificação:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# Validação cruzada (5 folds)
scores_cv = cross_val_score(modelo, X, y, cv=5)
print(f"Acurácia média na validação cruzada: {scores_cv.mean():.2f}")
print(f"Desvio padrão: {scores_cv.std():.2f}")
# 5 - Testar com novos exemplos
novas_amostras = np.array([
[5.1, 3.5, 1.4, 0.2], # provável Setosa
[6.0, 2.7, 4.1, 1.0], # provável Versicolor
[6.9, 3.1, 5.4, 2.1], # provável Virginica
])
predicoes = modelo.predict(novas_amostras)
for amostra, classe in zip(novas_amostras, predicoes):
print(f"Amostra {amostra} -> Classe prevista: {iris.target_names[classe]}")