Este notebook está diseñado para resolver un problema supervisado (regresión) utilizando un modelo de red neuronal MLPRegressor, y aplicar optimización de hiperparámetros (grid search) con validación cruzada (10 folds).
Carga del conjunto de datos Utiliza el conjunto de datos Breast Cancer Wisconsin disponible en el siguiente enlace: https://raw.githubusercontent.com/marsgr6/rna-online/refs/heads/main/data/breast\_cancer.csv
Preprocesamiento básico
Diseña un modelo de red neuronal (MLPClassifier) y Optimiza los hiperparámetros
scikit-learn y usa GridSearchCV con validación cruzada de 10 folds para encontrar la mejor combinación de hiperparámetros (activation, hidden_layer_sizes, etc.).Entrenamiento y evaluación del modelo
Métricas de desempeño en un conjunto de prueba
classification_report y confusion_matrix de sklearn.Análisis de resultados
En esta tarea trabajarás con un conjunto de datos de cáncer de mama y aplicarás una red neuronal multicapa (MLPClassifier) usando un pipeline, con búsqueda de los mejores hiperparámetros mediante validación cruzada.
Solo necesitarás modificar algunas partes específicas del código indicadas con # 👈 CAMBIA AQUÍ.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Cargar los datos desde GitHub
df = pd.read_csv("https://raw.githubusercontent.com/marsgr6/rna-online/refs/heads/main/data/breast_cancer.csv")
# Visualizar la variable objetivo
plt.figure(figsize=(8, 6))
ax = sns.countplot(
data=df,
x="target", # 👈 CAMBIA AQUÍ si tu variable objetivo tiene otro nombre
hue="target",
palette={'maligno': 'tomato', 'benigno': 'steelblue'}
)
for container in ax.containers:
ax.bar_label(container, label_type='edge', padding=2)
plt.title("Distribución de la variable objetivo")
plt.xlabel("Clase")
plt.ylabel("Frecuencia")
plt.tight_layout()
from sklearn.model_selection import train_test_split
# Separar variables predictoras y objetivo
X = df.drop(columns='target') # 👈 CAMBIA AQUÍ si tu variable objetivo tiene otro nombre
y = df['target']
# Partición del dataset
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, stratify=y, random_state=42
)
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import GridSearchCV, StratifiedKFold
# Crear pipeline: escalador + red neuronal
pipe = make_pipeline(
StandardScaler(),
MLPClassifier(max_iter=1000, random_state=42)
)
# Definir hiperparámetros a probar
param_grid = {
'mlpclassifier__hidden_layer_sizes': [(neuornas1,), (neuronas2,), (neuronas3,)], # 👈 CAMBIA AQUÍ las neuronas en la capa oculta, 50,100,200
'mlpclassifier__activation': [fx1, fx2], # 👈 CAMBIA AQUÍ la activation function, puedes probar 'relu', 'tanh'
'mlpclassifier__alpha': [0.0001, 0.001, 0.01] # 👈 Regularización L2
}
# Validación cruzada estratificada
cv = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
# Buscar los mejores parámetros
grid = GridSearchCV(pipe, param_grid=param_grid, cv=cv, scoring='f1_macro', n_jobs=-1)
grid.fit(X_de_entrenamiento, y_entrenamiento) # 👈 CAMBIA AQUÍ X_train, y_train
# Mostrar el mejor modelo
print("Mejores hiperparámetros encontrados:")
print(grid.best_params_)
cross_val_score sobre el mejor modelo encontrado.from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report, ConfusionMatrixDisplay
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Extraer el mejor modelo del GridSearchCV
best_model = grid.best_estimator_
# Validación cruzada con 10 folds para distintas métricas
scoring = ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']
cv_scores = {}
for metric in scoring:
scores = cross_val_score(best_model, X_de_entrenamiento, y_entrenamiento # 👈 CAMBIA AQUÍ X_train, y_train
cv=10, scoring=metric, n_jobs=-1)
cv_scores[metric] = scores
# Convertir a DataFrame
cv_df = pd.DataFrame(cv_scores)
# Mostrar resumen
summary = cv_df.agg(['mean', 'std']).T
print("\nResumen de métricas con validación cruzada (10 folds):")
print(summary)
# Convertir a formato largo para graficar
df_long = cv_df.melt(var_name="Métrica", value_name="Puntaje")
# Crear la figura
plt.figure(figsize=(10, 6))
# Boxplot + stripplot + línea de la media
sns.violinplot(data=df_long, x="Métrica", y="Puntaje", hue="Métrica", alpha=.3, cut=0, inner='quartil')
sns.stripplot(data=df_long, x="Métrica", y="Puntaje", hue="Métrica", size=6, alpha=0.6)
# Agregar líneas de medias y barras de error
sns.lineplot(data=df_long, x="Métrica", y="Puntaje", err_style='bars')
# Etiquetas y estilo
plt.title("Distribución de métricas (10-fold CV)")
plt.ylabel("Puntaje")
plt.xlabel("Métrica")
#plt.ylim(0.6, 1.05)
#plt.grid(True)
plt.tight_layout()
# Predecir sobre el conjunto de prueba
y_pred = best_model.predict(X_test)
# Reporte de clasificación
print("\nReporte de clasificación (conjunto de prueba):\n")
print(classification_report(y_prueba, y_pred)) # 👈 CAMBIA AQUÍ y_test, y_pred
# Matriz de confusión
ConfusionMatrixDisplay.from_predictions(
y_test, y_pred,
display_labels=['Benigno', 'Maligno'],
cmap='Blues',
colorbar=False
)
plt.title("Matriz de confusión (conjunto de prueba)")
plt.grid(False)
plt.tight_layout()
Puedes probar con diferentes:
Comenta brevemente los resultados obtenidos:
Esta actividad tiene como objetivo aplicar un modelo de red neuronal multicapa para resolver un problema de clasificación binaria (detección de tumores benignos o malignos). El análisis se realiza sobre el conjunto de datos Breast Cancer Wisconsin.
Revisa la distribución de la variable objetivo. Analiza el gráfico adjunto que muestra la cantidad de casos malignos y benignos.
🧩 Actividad:

Explica con tus palabras en qué consiste el proceso de dividir el conjunto de datos en entrenamiento y prueba. Describe también qué significa realizar una validación cruzada de 10 folds.
🧩 Actividad:
Se entrenó un modelo de red neuronal (MLPClassifier) aplicando una búsqueda en malla (Grid Search) con validación cruzada estratificada de 10 folds. Esta técnica permite probar distintas combinaciones de parámetros del modelo para encontrar la que maximiza el rendimiento.
Los hiperparámetros explorados fueron:
| Hiperparámetro | Valores considerados | Descripción breve |
|---|---|---|
hidden_layer_sizes |
(50,), (100,), (200,) | Cantidad de neuronas en la capa oculta |
activation |
'relu', 'tanh' |
Función de activación utilizada en las neuronas |
alpha |
0.0001, 0.001, 0.01 | Coeficiente de regularización L2 (evita sobreajuste) |
🧠 Mejor configuración encontrada:
{'mlpclassifier__activation': 'relu', 'mlpclassifier__alpha': 0.0001, 'mlpclassifier__hidden_layer_sizes': (200,)}
🧩 Actividad:
relu?alpha en este caso?Se calcularon métricas de desempeño en validación cruzada utilizando los siguientes indicadores:
| Métrica | Media | Desviación estándar |
|---|---|---|
| Accuracy | 0.9823 | 0.0172 |
| Precision_macro | 0.9855 | 0.0138 |
| Recall_macro | 0.9773 | 0.0235 |
| F1_macro | 0.9807 | 0.0191 |

🧩 Actividad:
Se evaluó el desempeño del modelo entrenado sobre el 30% del conjunto de datos reservado para prueba. Aquí están las métricas:
📄 Reporte de clasificación (conjunto de prueba):
| Clase | Precision | Recall | F1-score | Soporte |
|---|---|---|---|---|
| Benigno | 0.96 | 1.00 | 0.98 | 107 |
| Maligno | 1.00 | 0.92 | 0.96 | 64 |
| Accuracy: 0.97 |

🧩 Actividad:
🧩 Actividad:
⏱️ Tiempo estimado de desarrollo: 2 horas ✍️ Entrega: Informe ejecutivo con respuestas a cada sección y discusión de los gráficos presentados.
En esta tarea, el estudiante podrá seleccionar el conjunto de datos con el que desea trabajar.
sklearn.datasets, tensorflow.keras.datasets, openml, etc.).train_test_split).StandardScaler u otra técnica adecuada.MLPClassifierMLPRegressorDefinir un espacio de búsqueda de hiperparámetros, por ejemplo:
hidden_layer_sizes)activation)alpha)👉 Con Gemini, se puede pedir: "Genera un pipeline con StandardScaler y MLPClassifier, y aplica GridSearchCV con 10 folds."
GridSearchCV (o RandomizedSearchCV) con validación cruzada de 10 folds.best_params_).Evaluar el rendimiento con métricas adecuadas:
Visualizar resultados con gráficos:
y_true vs y_pred (regresión).Documenta brevemente:
En esta tarea, el estudiante podrá seleccionar el dataset con el que desea trabajar en KNIME.
Para clasificación:

Para regresión:

Reflexionar: