Red neuronal para regresión
Aquí tienes un ejemplo para construir y entrenar una red neuronal con Keras para el dataset fetch_california_housing
, disponible en scikit-learn
. Este dataset se usa para problemas de regresión (predicción de valores numéricos, como el precio de una casa en California).
El ejemplo incluye los siguientes pasos:
- Carga y preprocesamiento del dataset.
- Construcción y entrenamiento de la red neuronal.
- Evaluación y graficado de las predicciones frente a los valores reales.
Paso 1: Preparación de los Datos
Cargamos el dataset y lo preprocesamos para que se ajuste a la red neuronal.
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt
import numpy as np
# Cargar el dataset de California Housing
data = fetch_california_housing()
X, y = data.data, data.target # X = características, y = objetivo (precio medio de la vivienda)
# Dividir en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Escalar los datos (es importante para mejorar el rendimiento en redes neuronales)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
Paso 2: Construcción y Entrenamiento del Modelo
Creamos una red neuronal para la regresión (con una capa de salida de una sola neurona sin función de activación).
# Crear el modelo de red neuronal para regresión
model = Sequential([
Dense(64, input_shape=(X_train.shape[1],), activation='relu'),
Dense(32, activation='relu'),
Dense(1) # Capa de salida para regresión
])
# Compilar el modelo
model.compile(optimizer='adam', loss='mse', metrics=['mae']) # mse = Mean Squared Error, mae = Mean Absolute Error
# Entrenar el modelo
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)
Paso 3: Graficar el Proceso de Entrenamiento
Podemos graficar la pérdida (mse
) y el error absoluto medio (mae
) durante el entrenamiento.
# Graficar la pérdida y precisión (mae) durante el entrenamiento
plt.figure(figsize=(14, 5))
# Pérdida (MSE)
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Entrenamiento')
plt.plot(history.history['val_loss'], label='Validación')
plt.xlabel('Épocas')
plt.ylabel('MSE (Error Cuadrático Medio)')
plt.title('Pérdida durante el Entrenamiento')
plt.legend()
# Error Absoluto Medio (MAE)
plt.subplot(1, 2, 2)
plt.plot(history.history['mae'], label='Entrenamiento')
plt.plot(history.history['val_mae'], label='Validación')
plt.xlabel('Épocas')
plt.ylabel('MAE (Error Absoluto Medio)')
plt.title('Error Absoluto Medio durante el Entrenamiento')
plt.legend()
plt.show()
Paso 4: Evaluar el Modelo y Graficar las Predicciones
Generamos predicciones sobre los datos de prueba y las comparamos con los valores reales.
# Predecir en el conjunto de prueba
y_pred = model.predict(X_test).flatten() # Aplanar para que sea 1D
# Graficar predicciones frente a valores reales
plt.figure(figsize=(10, 5))
plt.plot(y_test[:100], label='Valores Reales', marker='o')
plt.plot(y_pred[:100], label='Predicciones', marker='x')
plt.xlabel('Muestras')
plt.ylabel('Precio Medio de la Vivienda')
plt.title('Predicciones vs Valores Reales (Primeras 100 Muestras)')
plt.legend()
plt.show()
Explicación del Código
- Estructura del modelo: La red tiene una capa de salida con 1 neurona, ya que estamos tratando con un problema de regresión. No utilizamos una función de activación en la última capa.
- Métricas:
mse
(Error cuadrático medio) como la función de pérdida, ya que es adecuada para problemas de regresión.mae
(Error absoluto medio) para evaluar el rendimiento de forma más intuitiva.
- Visualización:
- Graficamos tanto
mse
comomae
para ver el progreso en el entrenamiento. - Comparamos los valores de predicción y los valores reales de las primeras 100 muestras del conjunto de prueba.
- Graficamos tanto
from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import matplotlib.pyplot as plt import numpy as np # Cargar el dataset de California Housing data = fetch_california_housing() X, y = data.data, data.target # X = características, y = objetivo (precio medio de la vivienda) # Dividir en conjuntos de entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # Escalar los datos (es importante para mejorar el rendimiento en redes neuronales) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # Crear el modelo de red neuronal para regresión model = Sequential([ Dense(64, input_shape=(X_train.shape[1],), activation='relu'), Dense(32, activation='relu'), Dense(1) # Capa de salida para regresión ]) # Compilar el modelo model.compile(optimizer='adam', loss='mse', metrics=['mae']) # mse = Mean Squared Error, mae = Mean Absolute Error # Entrenar el modelo history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2) # Graficar la pérdida y precisión (mae) durante el entrenamiento plt.figure(figsize=(14, 5)) # Pérdida (MSE) plt.subplot(1, 2, 1) plt.plot(history.history['loss'], label='Entrenamiento') plt.plot(history.history['val_loss'], label='Validación') plt.xlabel('Épocas') plt.ylabel('MSE (Error Cuadrático Medio)') plt.title('Pérdida durante el Entrenamiento') plt.legend() # Error Absoluto Medio (MAE) plt.subplot(1, 2, 2) plt.plot(history.history['mae'], label='Entrenamiento') plt.plot(history.history['val_mae'], label='Validación') plt.xlabel('Épocas') plt.ylabel('MAE (Error Absoluto Medio)') plt.title('Error Absoluto Medio durante el Entrenamiento') plt.legend() plt.show() # Predecir en el conjunto de prueba y_pred = model.predict(X_test).flatten() # Aplanar para que sea 1D # Graficar predicciones frente a valores reales plt.figure(figsize=(10, 5)) plt.plot(y_test[:100], label='Valores Reales', marker='o') plt.plot(y_pred[:100], label='Predicciones', marker='x') plt.xlabel('Muestras') plt.ylabel('Precio Medio de la Vivienda') plt.title('Predicciones vs Valores Reales (Primeras 100 Muestras)') plt.legend() plt.show() import seaborn as sns from sklearn.linear_model import LinearRegression # Graficar las predicciones frente a los valores reales en el conjunto de prueba plt.figure(figsize=(8, 8)) # Gráfico de dispersión sns.scatterplot(x=y_test, y=y_pred, label='Predicciones') # Ajustar una línea de regresión para ver la relación entre valores reales y predichos regressor = LinearRegression() regressor.fit(y_test.reshape(-1, 1), y_pred) # Ajustar el modelo de regresión lineal line_x = np.linspace(min(y_test), max(y_test), 100) # Crear una línea de puntos para el eje X line_y = regressor.predict(line_x.reshape(-1, 1)) # Predecir valores Y para esos puntos X # Agregar línea de regresión de los datos predichos plt.plot(line_x, line_y, color="red", label="Línea de Regresión Predicha") # Línea ideal (y=x) para comparar con una predicción perfecta plt.plot(line_x, line_x, color="green", linestyle="--", label="Línea Ideal (y=x)") # Personalizar el gráfico plt.xlabel("Valores Reales") plt.ylabel("Predicciones") plt.title("Predicciones vs Valores Reales con Línea de Regresión") plt.legend() plt.show()