para la solución del ejercicio nos valimos de la opinion del instructor y usamos el algoritmo KNN el lugar del algoritmo de arbol de decisión. Asimismo le preguntamos a la IA si el algoritmo estaba correcto y esta nos refino el resultado añadiendo algunas secciones para daar mas claridad al algoritmo.
# Paso 1: Importar las bibliotecas necesarias
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.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
# Paso 2: Cargar y preparar el dataset Iris
dataset = datasets.load_iris()
# Convertir a DataFrame de Pandas para facilitar la manipulación de los datos
df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
df['target'] = dataset.target
# NOTA: sección creada con IA, Objetivo explorar los datos generados
print("=" * 55)
print(" DATASET IRIS - PRIMERAS FILAS")
print("=" * 55)
print(df.head())
print(f"\nForma del dataset: {df.shape}")
print(f"Especies: {list(dataset.target_names)}")
# Paso 3: Separar atributos (X) y etiquetas (y)
X = df.iloc[:, :-1] # Todas las columnas excepto la última
y = df['target'] # Columna de especie, que contiene las clases, es la Última columna,
# Paso 4: Normalizar los datos (importante e indispensable para KNN)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Paso 5: Dividir los datos en conjunto de entrenamiento y prueba (80% entrenamiento y 20% prueba)
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.2, random_state=42
)
print(f"\nMuestras de entrenamiento : {X_train.shape[0]}")
print(f"Muestras de prueba : {X_test.shape[0]}")
# Paso 6: entrenamos el modelo
model = KNeighborsClassifier()
model.fit(X_train, y_train)
# Paso 7: evaluamos el rendimiento del modelo
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("\n" + "=" * 55)
print(" EVALUACIÓN DEL MODELO KNN")
print("=" * 55)
print(f"Precisión en datos de prueba : {accuracy:.2f} ({accuracy*100:.2f}%)")
# Validación cruzada (5 pliegues)
cross_val_scores = cross_val_score(model, X_scaled, y, cv=5)
print(f"Precisión media (cross-val) : {cross_val_scores.mean():.2f} ({cross_val_scores.mean()*100:.2f}%)")
print(f"Desviación estándar : {cross_val_scores.std():.4f}")
#Paso 8: PROBAR CON NUEVOS EJEMPLOS
print("\n" + "=" * 55)
print(" PREDICCIÓN CON NUEVAS MUESTRAS")
print("=" * 55)
nuevas_muestras = np.array([
[5.1, 3.5, 1.4, 0.2], # Probable Orquidea
[6.0, 2.9, 4.5, 1.5], # Probable Azucena
[6.7, 3.1, 5.6, 2.4], # Probable Lirio
])
# Normalizar las nuevas muestras con el mismo scaler entrenado
nuevas_muestras_scaled = scaler.transform(nuevas_muestras)
predicciones = model.predict(nuevas_muestras_scaled)
columnas = dataset.feature_names
for i, (muestra, pred) in enumerate(zip(nuevas_muestras, predicciones)):
print(f"\nMuestra {i+1}: {dict(zip(columnas, muestra))}")
print(f" → Especie predicha: {dataset.target_names[pred]}")
el resultado fue el siguiente:
=======================================================
DATASET IRIS - PRIMERAS FILAS
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
target
0 0
1 0
2 0
3 0
4 0
Forma del dataset: (150, 5)
Especies: [np.str_('setosa'), np.str_('versicolor'), np.str_('virginica')]
Muestras de entrenamiento : 120
Muestras de prueba : 30
=======================================================
EVALUACIÓN DEL MODELO KNN
Precisión en datos de prueba : 1.00 (100.00%)
Precisión media (cross-val) : 0.96 (96.00%)
Desviación estándar : 0.0249