Ejemplos de redes con keras
Clasificación binaria:
import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam from tensorflow.keras.losses import BinaryCrossentropy from tensorflow.keras.metrics import BinaryAccuracy # Generar datos de ejemplo X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) # Dividir en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Crear el modelo model = Sequential([ Dense(64, activation='relu', input_shape=(X_train.shape[1],)), Dense(32, activation='relu'), Dense(1, activation='sigmoid') # Salida para clasificación binaria ]) # Compilar el modelo model.compile(optimizer=Adam(), loss=BinaryCrossentropy(), metrics=[BinaryAccuracy()]) # Entrenar el modelo history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.2, verbose=1) # Evaluar el modelo en el conjunto de prueba loss, accuracy = model.evaluate(X_test, y_test, verbose=0) print(f"Precisión del modelo en el conjunto de prueba: {accuracy:.2f}") # También podemos ver el historial de entrenamiento (opcional) import matplotlib.pyplot as plt plt.plot(history.history['binary_accuracy'], label='Precisión en entrenamiento') plt.plot(history.history['val_binary_accuracy'], label='Precisión en validación') plt.xlabel('Época') plt.ylabel('Precisión') plt.legend() plt.show()
Multiclase:
import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam from tensorflow.keras.losses import SparseCategoricalCrossentropy from tensorflow.keras.metrics import SparseCategoricalAccuracy # Generar datos de ejemplo X, y = make_classification(n_samples=1000, n_features=20, n_classes=3, n_informative=15, random_state=42) # Dividir en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Crear el modelo model = Sequential([ Dense(64, activation='relu', input_shape=(X_train.shape[1],)), Dense(32, activation='relu'), Dense(3, activation='softmax') # 3 neuronas de salida para 3 clases ]) # Compilar el modelo model.compile(optimizer=Adam(), loss=SparseCategoricalCrossentropy(), metrics=[SparseCategoricalAccuracy()]) # Entrenar el modelo history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.2, verbose=1) # Evaluar el modelo en el conjunto de prueba loss, accuracy = model.evaluate(X_test, y_test, verbose=0) print(f"Precisión del modelo en el conjunto de prueba: {accuracy:.2f}") # Graficar el historial de precisión (opcional) import matplotlib.pyplot as plt plt.plot(history.history['sparse_categorical_accuracy'], label='Precisión en entrenamiento') plt.plot(history.history['val_sparse_categorical_accuracy'], label='Precisión en validación') plt.xlabel('Época') plt.ylabel('Precisión') plt.legend() plt.show()
Regresión lineal:
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam # Generar datos de ejemplo np.random.seed(42) X = np.random.rand(1000, 1) * 10 # 1000 muestras, 1 característica (X) y = 2.5 * X + np.random.randn(1000, 1) # Relación lineal con ruido # Dividir en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Crear el modelo model = Sequential([ Dense(1, input_shape=(X_train.shape[1],)) # 1 neurona para la salida ]) # Compilar el modelo model.compile(optimizer=Adam(learning_rate=0.01), loss='mean_squared_error') # Entrenar el modelo history = model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1) # Evaluar el modelo en el conjunto de prueba loss = model.evaluate(X_test, y_test, verbose=0) print(f"Pérdida del modelo en el conjunto de prueba: {loss:.2f}") # Hacer predicciones y_pred = model.predict(X_test) # Graficar resultados plt.scatter(X_test, y_test, label='Datos reales', alpha=0.5) plt.scatter(X_test, y_pred, color='red', label='Predicciones', alpha=0.5) plt.xlabel('X') plt.ylabel('y') plt.title('Regresión Lineal con Keras') plt.legend() plt.show()
Polinómicas:
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam from sklearn.preprocessing import PolynomialFeatures # Generar datos de ejemplo np.random.seed(42) X = np.random.rand(1000, 1) * 10 # 1000 muestras, 1 característica (X) y = 0.5 * X**3 - 2 * X**2 + 3 * X + np.random.randn(1000, 1) * 5 # Relación polinómica con ruido # Transformar características a polinomios poly = PolynomialFeatures(degree=3) # Cambia el grado según lo que necesites X_poly = poly.fit_transform(X) # Dividir en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X_poly, y, test_size=0.2, random_state=42) # Crear el modelo model = Sequential([ Dense(64, activation='relu', input_shape=(X_train.shape[1],)), Dense(64, activation='relu'), Dense(1) # Capa de salida para regresión ]) # Compilar el modelo model.compile(optimizer=Adam(learning_rate=0.01), loss='mean_squared_error') # Entrenar el modelo history = model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1) # Evaluar el modelo en el conjunto de prueba loss = model.evaluate(X_test, y_test, verbose=0) print(f"Pérdida del modelo en el conjunto de prueba: {loss:.2f}") # Hacer predicciones y_pred = model.predict(X_test) # Graficar resultados plt.scatter(X_test[:, 1], y_test, label='Datos reales', alpha=0.5) # Usar la característica polinómica de interés plt.scatter(X_test[:, 1], y_pred, color='red', label='Predicciones', alpha=0.5) plt.xlabel('X') plt.ylabel('y') plt.title('Regresión Polinómica con Keras') plt.legend() plt.show()
El dataset Iris:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncoder from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.utils import to_categorical # 1. Cargar el conjunto de datos Iris iris = load_iris() X = iris.data # Características y = iris.target # Etiquetas # 2. Preprocesar los datos # Convertir las etiquetas a formato one-hot y = to_categorical(y) # 3. Dividir los datos en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 4. Construir y compilar el modelo model = Sequential() model.add(Dense(10, input_dim=4, activation='relu')) # Capa oculta model.add(Dense(3, activation='softmax')) # Capa de salida para clasificación multi-clase model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 5. Entrenar el modelo history = model.fit(X_train, y_train, epochs=100, batch_size=5, validation_data=(X_test, y_test)) # 6. Evaluar el modelo loss, accuracy = model.evaluate(X_test, y_test, verbose=0) print(f"Pérdida del modelo: {loss:.2f}, Precisión: {accuracy:.2f}") # 7. Visualizar los resultados # Graficar la precisión y la pérdida durante el entrenamiento plt.figure(figsize=(12, 4)) # Gráfico de la precisión plt.subplot(1, 2, 1) plt.plot(history.history['accuracy'], label='Precisión en entrenamiento') plt.plot(history.history['val_accuracy'], label='Precisión en validación') plt.title('Precisión del modelo') plt.xlabel('Épocas') plt.ylabel('Precisión') plt.legend() # Gráfico de la pérdida plt.subplot(1, 2, 2) plt.plot(history.history['loss'], label='Pérdida en entrenamiento') plt.plot(history.history['val_loss'], label='Pérdida en validación') plt.title('Pérdida del modelo') plt.xlabel('Épocas') plt.ylabel('Pérdida') plt.legend() plt.tight_layout() plt.show()