Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

construindo um classificador com o dataset Iris

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()}")

1 resposta

Olá, Deivide! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou o KNN para classificação com Python, utilizou muito bem a validação cruzada com Árvore de Decisão para garantir robustez e ainda compreendeu a importância da avaliação com novos exemplos para validar a generalização do modelo.

Uma dica interessante para o futuro é testar diferentes valores de n_neighbors no KNN e comparar os resultados com outras métricas além da acurácia. Assim:

for k in range(1, 11):
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    score = knn.score(X_test, y_test)
    print(f"K={k}, Acurácia: {score:.2f}")

Isso ajuda a identificar o valor ótimo de vizinhos para o dataset.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Normalizar os dados: garante que atributos em diferentes escalas não distorçam a distância entre vizinhos.
  • Comparar diferentes classificadores: como SVM ou Random Forest para verificar ganhos de desempenho.
  • Utilizar métricas adicionais: como precisão, recall e F1-score para uma avaliação mais completa.

Ah, uma pergunta: você acha mais interessante ajustar hiperparâmetros como n_neighbors para melhorar o KNN ou prefere comparar diretamente diferentes algoritmos de classificação para escolher o mais robusto?

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!