El objetivo de esta tarea es diseñar e implementar un perceptrón multicapa (MLP) con al menos una capa oculta para resolver un problema de clasificación binaria. El ejercicio busca que el estudiante aplique los conceptos fundamentales de las redes neuronales artificiales: funciones de activación, propagación hacia adelante (forward propagation), retropropagación del error (backpropagation), ajuste de pesos y evaluación de desempeño.
Al finalizar, el estudiante será capaz de modelar un problema donde, a partir de múltiples variables numéricas, se predice una variable categórica dicotómica (benigno/maligno).
Tiempo estimado: 2 horas
El dataset Breast Cancer Wisconsin, disponible en sklearn.datasets, contiene datos clínicos utilizados para diagnosticar tumores mamarios como malignos o benignos, a partir de características extraídas de imágenes digitales de células obtenidas por aspiración con aguja fina (FNA).
El dataset tiene 30 variables numéricas (todas ya preprocesadas), agrupadas en 10 atributos básicos calculados para tres estadísticos: media, desviación estándar y valor peor ("worst" o máximo).
Aquí están los atributos y su agrupación (10 variables $\times$ 3 atributos - mean, se, worst):
| Categoría | Variable base | Estadísticos disponibles |
|---|---|---|
| 1. Tamaño del núcleo | radius |
mean, se, worst |
| 2. Textura | texture |
mean, se, worst |
| 3. Perímetro | perimeter |
mean, se, worst |
| 4. Área | area |
mean, se, worst |
| 5. Suavidad | smoothness |
mean, se, worst |
| 6. Compacidad | compactness |
mean, se, worst |
| 7. Concavidad | concavity |
mean, se, worst |
| 8. Puntos cóncavos | concave points |
mean, se, worst |
| 9. Simetría | symmetry |
mean, se, worst |
| 10. Dimensión fractal | fractal dimension |
mean, se, worst |
Estas variables permiten evaluar la forma, tamaño y consistencia del núcleo celular para predecir si un tumor es cancerígeno.
target:
En este caso, se busca diagnosticar si un tumor es:
Definir el problema
Preparar los datos
Estandarizar características
Configurar el MLP (conceptualmente)
Entrenar
Predecir y decidir
Evaluar
Comentar resultados
En esta tarea trabajarás con un conjunto de datos de cáncer de mama y aplicarás una red neuronal multicapa (MLP) para clasificar los diagnósticos como benignos o malignos. 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
# Leer el archivo CSV desde GitHub
df = pd.read_csv("https://raw.githubusercontent.com/marsgr6/rna-online/refs/heads/main/data/breast_cancer.csv")
# Visualizar frecuencias de la variable objetivo
plt.figure(figsize=(8, 6))
ax = sns.countplot(
data=df,
x="columna_a_modelar", # 👈 CAMBIA AQUÍ, columna_a_modelar por el nombre de la columna a modelar
hue="columna_a_modelar", # 👈 CAMBIA AQUÍ, columna_a_modelar por el nombre de la columna a modelar
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()
`
# Seleccionar algunas variables numéricas (puedes cambiar)
features = ['mean radius', 'mean texture', 'mean perimeter', 'mean area', 'mean smoothness'] # 👈 CAMBIA AQUÍ si deseas otras variables
# Pairplot para explorar relaciones entre variables
sns.pairplot(data=df[features + ['target']], hue='target', palette={'maligno': 'tomato', 'benigno': 'steelblue'})
plt.suptitle("Visualización por pares de variables", y=1.02)
from sklearn.model_selection import train_test_split
# Definir variables X e y
X = df.drop(columns=['target'])
y = df['target']
# Separar datos (ej. 70% entrenamiento, 30% prueba)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, stratify=y, random_state=42 # 👈 CAMBIA AQUÍ el porcentaje si deseas
)
from sklearn.preprocessing import StandardScaler
# Normalizar características numéricas
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(datos_de_entrenamiento) # 👈 CAMBIA AQUÍ datos_de_entrenamiento, usa X_train
X_test_scaled = scaler.transform(datos_de_prueba) # 👈 CAMBIA AQUÍ datos_de_prueba, usa X_test
from sklearn.neural_network import MLPClassifier
# Crear y entrenar el modelo
mlp = MLPClassifier(hidden_layer_sizes=(numero_de_nueronas,), max_iter=1000, random_state=42) # 👈 CAMBIA AQUÍ numero_de_nueronas por un valor numérico entero
mlp.fit(X_train_scaled, y_train)
from sklearn.metrics import classification_report, ConfusionMatrixDisplay
# Realizar predicciones
y_pred = mlp.predict(test_data) # 👈 CAMBIA AQUÍ test_data, usa X_test_scaled
# Reporte de clasificación
print("\nReporte de clasificación:\n", classification_report(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")
plt.grid(False)
plt.tight_layout()
Puedes probar con diferentes:
MLPClassifier(..., activation='relu'))Comente brevemente los resultados obtenidos: ¿el modelo clasificó correctamente la mayoría de los casos? ¿Qué métricas destacan? ¿Qué podría mejorar en una siguiente iteración?
Elabore un informe, de máximo 3 páginas, describiendo el proceso seguido para entrenar un modelo de red neuronal multicapa (MLP) utilizando datos clínicos de diagnóstico de cáncer de mama. El objetivo fue clasificar los tumores como benignos o malignos, a partir de medidas obtenidas de imágenes médicas. A continuación se detalla el proceso seguido, dividido en seis etapas clave. Analice cada sección utilizando las figuras y resultados proporcionados.
Describa la distribución de las clases maligno y benigno en el conjunto de datos. Analice si existe desbalance y qué implicaciones podría tener.

Comente las relaciones visuales entre las variables numéricas seleccionadas. ¿Qué patrones o separaciones observas entre las clases?

Explique cómo se dividió el conjunto de datos (porcentaje, estratificación) y justifique si es adecuado para este tipo de problema.
Justifique el uso de StandardScaler. ¿Qué importancia tiene el escalamiento previo al entrenamiento de una red neuronal?
Describa brevemente la arquitectura utilizada (número de capas, neuronas, iteraciones) y la función del modelo MLPClassifier.
a) Matriz de Confusión
Analice el desempeño del modelo con base en los valores observados en la matriz de confusión.

b) Reporte de Clasificación
Comente los valores de precisión, recall y F1-score. ¿El modelo clasifica bien ambas clases?
Reporte de clasificación:
precision recall f1-score support
benigno 0.98 0.99 0.99 107
maligno 0.98 0.97 0.98 64
accuracy 0.98 171
macro avg 0.98 0.98 0.98 171
weighted avg 0.98 0.98 0.98 171
Redacte una conclusión ejecutiva sobre el desempeño general del modelo, su aplicabilidad al problema de diagnóstico médico, y posibles mejoras futuras.
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.MLPClassifierMLPRegressorVisualizaciones adicionales:
y_true vs. y_pred.Documentar brevemente:
En esta tarea, el estudiante podrá seleccionar el dataset con el que desea trabajar en KNIME.
Para clasificación:

Para regresión:

Entrenar el modelo y conectar con el nodo Predictor.