Clasificación binaria 0 vs 1 con Perceptrón y Regresión Logística sobre MNIST
Puedes ver Codigo en colab Aqui
El aprendizaje automático básico incluye modelos lineales que aún hoy son útiles para entender conceptos fundamentales. En este post revisamos la tarea de distinguir entre los dígitos 0 y 1 del dataset MNIST usando Perceptrón y Regresión Logística.
Dataset y preprocesado
- Usamos MNIST (28x28, 784 features). Filtramos solo las muestras con etiquetas 0 y 1.
- Dividimos los datos en Train (70%), Validation (15%) y Test (15%) preservando la proporción de clases con stratify.
- Normalizamos features con StandardScaler ajustado al conjunto de entrenamiento.
Modelos
- Perceptrón: sklearn.linear_model.Perceptron(max_iter=1000, random_state=42)
- Regresión Logística: sklearn.linear_model.LogisticRegression(max_iter=1000, random_state=42)
Nos vamos directo a la parte 5 para poder entender cada modelo y algoritmos
Parte 5: Entrenar Perceptrón
Entrena un Perceptrón (clasificador lineal simple) usando los datos de training normalizados, y luego mide su desempeño en train y validation.
1. Crear el modelo:
perceptron = Perceptron(max_iter=1000, random_state=42)
- Perceptron(): Instancia el algoritmo del perceptrón desde scikit-learn.
- max_iter=1000: Número máximo de iteraciones (épocas) que el perceptrón intentará entrenar.
- random_state=42: AQUÍ VA LA RESPUESTA DE POR QUÉ 42 👇
2. Entrenar el modelo:
perceptron.fit(X_train_scaled, y_train)
- fit(): Ajusta el perceptrón a los datos de training.
- Internamente, el perceptrón actualiza sus pesos (coef_ e intercept_) usando la regla:
3. Evaluar en train y validation:
y_pred_train = perceptron.predict(X_train_scaled)
y_pred_val = perceptron.predict(X_val_scaled)
print(f"Accuracy en Train: {accuracy_score(y_train, y_pred_train):.4f}")
print(f"Accuracy en Validation: {accuracy_score(y_val, y_pred_val):.4f}")
- predict(): genera predicciones (0 o 1) para cada ejemplo.
- accuracy_score(): calcula el porcentaje de aciertos.
Comparar Train vs Validation ayuda a detectar overfitting: si Train es mucho más alto que Validation, el modelo memorizó entrenamiento pero no generaliza.
Parte 6: Entrenar Regresión Logística — Explicación detallada
log_reg = LogisticRegression(max_iter=1000, random_state=42)
log_reg.fit(X_train_scaled, y_train)
y_pred_train_lr = log_reg.predict(X_train_scaled)
y_pred_val_lr = log_reg.predict(X_val_scaled)
print(f"Accuracy en Train: {accuracy_score(y_train, y_pred_train_lr):.4f}")
print(f"Accuracy en Validation: {accuracy_score(y_val, y_pred_val_lr):.4f}")
¿Qué es la Regresión Logística?
A pesar de su nombre, NO es una regresión (que predice números continuos). Es un clasificador binario que:
- Estima la probabilidad de que un ejemplo pertenezca a la clase 1.
- Usa esa probabilidad para tomar decisiones: si P > 0.5, predice 1; si P ≤ 0.5, predice 0.
Analogía:
- Perceptrón: "Dibuja una línea recta separadora entre clases. Si un punto está a un lado → clase 0, al otro → clase 1".
- Regresión Logística: "Estima la probabilidad de que un punto pertenezca a clase 1. Usa esa probabilidad para decidir".
La función Logística (Sigmoid)
Regresión Logística transforma una función lineal en una probabilidad usando la función logística (sigmoid):
Donde:
- w: pesos del modelo.
- x: características (features).
- b: sesgo (intercept/bias).
- e: número de Euler (~2.718).
Visualización de la función sigmoid:
Cómo se entrena: La pérdida (Log-Loss)
A diferencia del Perceptrón que usa regla de actualización simple, Regresión Logística minimiza una función de pérdida llamada log-loss (entropía cruzada binaria):
¿Qué significa esto?
- Si la etiqueta real es 1 pero el modelo predice P=0.1 (muy bajo), la pérdida es GRANDE (malo).
- Si la etiqueta real es 1 y el modelo predice P=0.9 (alto), la pérdida es PEQUEÑA (bueno).
Tutoriales:
Redes Neuronales: De la Neurona al Perceptrón Multicapa en 9 minutos. El problema XOR
El PERCEPTRÓN ¡explicado! (demo interactivo)
REGRESIÓN LOGÍSTICA - TEORÍA | #37 Curso Machine Learning con Python