Para essa solução, utilizei o algoritmo KNN (K-Nearest Neighbors), que classifica as flores com base na proximidade de suas características, combinado com uma Árvore de Decisão na validação cruzada para garantir robustez.
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report
==========================================
1 - CARREGAR E EXPLORAR OS DADOS
==========================================
#Carregando o dataset do sklearn
iris = load_iris()
#Convertendo para DataFrame do Pandas para melhor visualização
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
#Mapeando os números para os nomes reais das espécies
df['species_name'] = df['species'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
print("--- Primeiras 5 linhas do Dataset Iris ---")
print(df.head(), "\n")
==========================================
2 - PRÉ-PROCESSAR OS DADOS
==========================================
#Separando atributos (X) e rótulos/targets (y)
X = iris.data
y = iris.target
#Dividindo em Treino (70%) e Teste (30%) com semente aleatória para reprodutibilidade
X_train, X_test, y_train, y_test = train_test_split(X, y, test_test_split=0.3, random_state=42, stratify=y)
print(f"Dados de Treino: {X_train.shape[0]} amostras")
print(f"Dados de Teste: {X_test.shape[0]} amostras\n")
==========================================
3 - TREINAR O MODELO DE CLASSIFICAÇÃO
==========================================
#Escolhendo o KNN (K-Nearest Neighbors) com 3 vizinhos
model = KNeighborsClassifier(n_neighbors=3)
Treinando o modelo
model.fit(X_train, y_train)
print("Modelo KNN treinado com sucesso!\n")
==========================================
4 - AVALIAR O DESEMPENHO DO MODELO
==========================================
#Fazendo previsões no conjunto de teste
y_pred = model.predict(X_test)
#Calculando a acurácia simples
accuracy = accuracy_score(y_test, y_pred)
print(f"Acurácia no conjunto de teste: {accuracy * 100:.2f}%")
#Relatório detalhado de classificação
print("\n--- Relatório de Classificação ---")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
#Validação Cruzada (usando k-fold = 5 e testando também com Árvore de Decisão)
dt_model = DecisionTreeClassifier(random_state=42)
cv_scores = cross_val_score(dt_model, X, y, cv=5)
print("--- Validação Cruzada (5-Folds com Árvore de Decisão) ---")
print(f"Scores de cada dobra: {cv_scores}")
print(f"Acurácia Média da Validação Cruzada: {cv_scores.mean() * 100:.2f}%\n")
==========================================
5 - TESTAR COM NOVOS EXEMPLOS
==========================================
print("--- Testando com Novos Exemplos (Dados Inéditos) ---")
#Amostra 1: Características típicas de uma Setosa (pétalas pequenas)
#Amostra 2: Características típicas de uma Virginica (pétalas grandes)
novas_flores = np.array([
[5.1, 3.5, 1.4, 0.2], # Exemplo 1
[6.7, 3.0, 5.2, 2.3] # Exemplo 2
])
#Fazendo a previsão
previsoes = model.predict(novas_flores)
#Exibindo o resultado traduzido
for i, pred in enumerate(previsoes):
nome_especie = iris.target_names[pred]
print(f"Nova flor {i+1} (Atributos: {novas_flores[i]}) -> Classificada como: {nome_especie.upper()}")