1. Reflexão: A Evolução da IA e o Impacto no Usuário
A inteligência artificial não surgiu repentinamente como a conhecemos hoje. Ela passou por fases distintas, e entender onde o nosso classificador Iris se encaixa ajuda a compreender o panorama geral.
-Sistemas Especialistas (O Passado): A IA era baseada em regras rígidas. Isso exigia que humanos programassem cada nuance. Era frágil e não lidava bem com o inesperado.
-Aprendizado de Máquina Clássico (Onde estamos agora): Em vez de ditar regras, alimentamos o computador com dados (tamanhos de pétalas) e respostas (espécies), e deixamos o algoritmo encontrar as regras estatísticas.
-Impacto no dia a dia: É a tecnologia por trás de filtros de spam, recomendação de produtos simples e detecção de fraudes em cartões de crédito.
-Deep Learning e IA Generativa (O Estado da Arte): Com o aumento do poder computacional, surgiram redes neurais profundas capazes de gerar texto (como eu!), imagens e vozes.
-Impacto no usuário: Assistentes virtuais, diagnósticos médicos por imagem e carros autônomos.
O impacto na experiência do usuário: Para o usuário final, acontece quando a tecnologia se torna invisível. Um classificador bem treinado (como o que faremos) reduz a carga cognitiva, automatiza tarefas repetitivas e oferece personalização. No entanto, isso traz a responsabilidade ética de garantir que os dados de treino não sejam enviesados.
2. Construindo o Classificador
Utilizaremos o algoritmo K-Nearest Neighbors (KNN) para classificar uma nova flor, ele "olha" para as $k$ flores mais parecidas que já conhece e decide com base na maioria.
# --- Etapa 1: Importação de Bibliotecas ---
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# --- Etapa 1 (Cont.): Carregar e Explorar os Dados ---
# Carregando o dataset
iris = load_iris()
# Criando o DataFrame para melhor visualização
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target # Adicionando a coluna alvo (0, 1 ou 2)
# Mapeando os números para nomes das espécies para facilitar a leitura
species_map = {0: 'setosa', 1: 'versicolor', 2: 'virginica'}
df['species_name'] = df['species'].map(species_map)
print("--- Primeiras 5 linhas do Dataset ---")
print(df.head())
print("\n")
# --- Etapa 2: Pré-processar os Dados ---
# Separando características (X) e rótulos (y)
X = iris.data
y = iris.target
# Dividindo em treino (80%) e teste (20%)
# random_state garante que o resultado seja reproduzível
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"Tamanho do treino: {X_train.shape[0]} amostras")
print(f"Tamanho do teste: {X_test.shape[0]} amostras\n")
# --- Etapa 3: Treinar o Modelo (KNN) ---
# Vamos usar k=3 (olhar para os 3 vizinhos mais próximos)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
print("--- Modelo Treinado com Sucesso ---\n")
# --- Etapa 4: Avaliar o Desempenho ---
# Fazendo previsões nos dados de teste
y_pred = knn.predict(X_test)
# Calculando a acurácia simples
acuracia = accuracy_score(y_test, y_pred)
print(f"Acurácia no conjunto de teste: {acuracia:.2f} (ou {acuracia*100:.1f}%)")
# Validação Cruzada (Cross-Validation)
# Divide os dados em 5 partes e testa 5 vezes para garantir que não foi sorte
cv_scores = cross_val_score(knn, X, y, cv=5)
print(f"Acurácia média na Validação Cruzada: {np.mean(cv_scores):.2f}")
print("-" * 30)
# --- Etapa 5: Testar com Novos Exemplos ---
# Vamos inventar duas flores novas
# Flor 1: Sépalas curtas, pétalas curtas (provável Setosa)
# Flor 2: Sépalas longas, pétalas longas (provável Virginica)
novas_amostras = np.array([
[5.0, 3.5, 1.5, 0.2],
[6.5, 3.0, 5.5, 1.8]
])
previsoes_novas = knn.predict(novas_amostras)
print("\n--- Classificando Novas Flores ---")
for i, pred in enumerate(previsoes_novas):
nome_especie = species_map[pred]
print(f"Amostra {i+1} classificada como: {nome_especie.capitalize()}")
Análise dos Resultados
Ao rodar o código acima, aqui está o que você deve observar em cada etapa conceitual:
1-Exploração: Você verá que as Setosas tendem a ser menores, enquanto as Virginicas são maiores.
2-Pré-processamento: A divisão train_test_split é crucial. Sem ela, o modelo apenas "decoraria" as respostas. Testar em dados nunca vistos simula o mundo real.
3-Desempenho: O algoritmo KNN costuma ter uma acurácia muito alta no dataset Iris, pois as classes são bem separadas visualmente.
Validação Cruzada: Se a acurácia da validação cruzada for próxima da acurácia de teste, isso indica que seu modelo é robusto e confiável.