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

Mão na massa: construindo um classificador com o dataset Iris

# 1. Carregar e explorar os dados:
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.metrics import accuracy_score

# 1.1. Carregar dataset:
iris = load_iris()

# 1.2. Converter para DataFrame:
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target

# 1.3. Visualizar primeiras linhas:
print("Primeiras linhas do dataset:")
print(df.head())

# 2. Pré-processar os dados:
X = df[iris.feature_names]   # atributos
y = df['species']            # rótulos

# 2.1. Dividir em treino e teste:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. Treinar modelo de classificação (KNN):
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 4. Avaliar desempenho:
y_pred = knn.predict(X_test)
print("\nAcurácia no conjunto de teste:", accuracy_score(y_test, y_pred))

scores = cross_val_score(knn, X, y, cv=5)
print("Acurácia média com validação cruzada:", scores.mean())

# 5. Testar com novos exemplos:
nova_flor = [[5.1, 3.5, 1.4, 0.2]]  # valores típicos da Setosa
predicao = knn.predict(nova_flor)
print("\nNova flor classificada como:", iris.target_names[predicao][0])

Primeiras linhas do dataset:
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
0                5.1               3.5                1.4               0.2   
1                4.9               3.0                1.4               0.2   
2                4.7               3.2                1.3               0.2   
3                4.6               3.1                1.5               0.2   
4                5.0               3.6                1.4               0.2   

   species  
0        0  
1        0  
2        0  
3        0  
4        0  

Acurácia no conjunto de teste: 1.0
Acurácia média com validação cruzada: 0.9666666666666668

Nova flor classificada como: setosa
/usr/local/lib/python3.12/dist-packages/sklearn/utils/validation.py:2739: UserWarning: X does not have valid feature names, but KNeighborsClassifier was fitted with feature names
  warnings.warn(
1 resposta

Olá, Andressa. Como vai?

Parabéns pelo excelente código! Você seguiu com precisão todas as etapas fundamentais de um fluxo de trabalho em Machine Learning: carregamento, divisão de dados, treinamento do KNN, avaliação robusta com validação cruzada e até a predição com novos dados.

A sua acurácia de 1.0 (100%) no conjunto de teste e de aproximadamente 96,6% na validação cruzada mostra que o algoritmo K-Nearest Neighbors funcionou muito bem, o que é comum com o dataset Iris por se tratar de uma base de dados linearmente bem distribuída.

Gostaria de destacar um ponto importante no final da sua saída. Note que o Python gerou um aviso (UserWarning):
UserWarning: X does not have valid feature names, but KNeighborsClassifier was fitted with feature names.

Esse aviso ocorre porque, no passo 2, você treinou o modelo (knn.fit) passando o DataFrame X_train, que possui o nome das colunas (feature names como sepal length, etc.). Porém, no passo 5, ao testar a nova flor, você passou uma lista pura do Python: nova_flor = [[5.1, 3.5, 1.4, 0.2]]. O scikit-learn avisa que os nomes das colunas estão faltando nesse novo dado, embora ele consiga fazer a previsão perfeitamente baseando-se apenas na ordem dos números.

Para corrigir esse aviso e deixar o seu código ainda mais profissional e otimizado, você pode passar a nova flor estruturada com as mesmas colunas do treino. Veja duas formas simples de resolver isso:

Abordagem 1: Usando um DataFrame do Pandas para os novos dados
Substitua o trecho do passo 5 por:

# 5. Testar com novos exemplos usando DataFrame:
nova_flor = pd.DataFrame([[5.1, 3.5, 1.4, 0.2]], columns=iris.feature_names)
predicao = knn.predict(nova_flor)
print("\nNova flor classificada como:", iris.target_names[predicao][0])

Abordagem 2: Convertendo os dados de treino em arrays do NumPy
Se preferir trabalhar com arrays sem nomes de colunas do início ao fim, você pode extrair apenas os valores brutos (.values) ao definir suas variáveis de treino:

# No passo 2, adicione .values para remover os cabeçalhos no treinamento:
X = df[iris.feature_names].values
y = df['species'].values

Qualquer uma dessas duas abordagens eliminará o aviso do console e garantirá que os dados de entrada tenham o mesmo formato estrutural que o classificador KNN espera.

Seu projeto "mão na massa" ficou excelente e serve como uma ótima referência de pipeline de classificação para o fórum!

Espero que possa ter lhe ajudado!