En el capítulo introductorio hicimos un repaso a las bases matemáticas del ajuste de funciones, y la optimización de los parámetros, y en el siguiente vimos cómo preparar los datos para el entrenamiento con modelos de IA, creo que ya es momento que nos metamos un poco más en materia y empezemos con Keras, una librería disponible en Python, sencilla de usar, y muy potente.
Pero ehhhhh! Alto ahí! Queda lo más importante, antes de empezar, tendremos que explicar un poco más a fondo es una red neuronal artifical, ¿no?
Se utilizan en las neuronas para introducir no linealidades en el modelo. Estas funciones determinan si una neurona se activa o no, es decir, si envía una señal más allá de cierto umbral.
Son parámetros ajustables en una red neuronal que se utilizan para ponderar las entradas y determinar la salida de cada neurona. Durante el entrenamiento, estos pesos se ajustan para minimizar una función de pérdida y mejorar el rendimiento del modelo.
Las neuronas son las unidades básicas de procesamiento en una red neuronal. Cada neurona toma entradas, realiza una operación en ellas y produce una salida.
Una forma simple de definir una red neuronal es como un conjunto de operaciones matemáticas aplicadas de forma secuencial y reiterada, con el objetivo de mejorar unos parámetros, y ajustar mejor una función de pérdida. Esta es una generalización que debe ser matizada, pero puede dar una idea más intuitiva de cómo funcionan internamente los modelos.
import matplotlib.pyplot as plt
import pandas as pd
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
val_df = pd.read_csv('val.csv')
X_train = train_df['area'].values.reshape(-1, 1)
y_train = train_df['price'].values
X_val = val_df['area'].values.reshape(-1, 1)
y_val = val_df['price'].values
X_test = test_df['area'].values.reshape(-1, 1)
y_test = test_df['price'].values
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# - Número de capas ocultas: 1
# - Número de neuronas en la capa: 8
# - Función de activación: RELU
# - Optimizador: Adam
# - Función de Pérdia: MSE
model = Sequential()
model.add(Dense(units=8, activation='relu', input_shape=(1,)))
model.add(Dense(units=1))
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), verbose=0)
test_loss = model.evaluate(X_test, y_test)
6/6 [==============================] - 0s 1ms/step - loss: 0.8779
# Predicciones del modelo
y_pred = model.predict(X_test)
# Gráfico de dispersión de precios reales vs. predicciones
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, label='Reales')
plt.scatter(X_test, y_pred, label='Predicciones')
plt.title('Precios Reales vs. Predicciones')
plt.xlabel('Área')
plt.ylabel('Precio')
plt.legend()
plt.show()
# Histograma de precios reales vs. predicciones
plt.figure(figsize=(10, 6))
plt.hist(y_test, bins=20, alpha=0.5, label='Reales')
plt.hist(y_pred, bins=20, alpha=0.5, label='Predicciones')
plt.title('Distribución de Precios Reales vs. Predicciones')
plt.xlabel('Precio')
plt.ylabel('Frecuencia')
plt.legend()
plt.show()
print(f'Pérdida en los datos de prueba: {test_loss}')
6/6 [==============================] - 0s 1ms/step
Pérdida en los datos de prueba: 0.877861738204956
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(units=8, activation='relu', input_shape=(1,)))
model.add(Dense(units=1, activation='tanh')) # Aplicación de tanh en la capa de salida
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), verbose=0)
test_loss = model.evaluate(X_test, y_test)
6/6 [==============================] - 0s 964us/step - loss: 0.9204
# Predicciones del modelo
y_pred = model.predict(X_test)
# Gráfico de dispersión de precios reales vs. predicciones
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, label='Reales')
plt.scatter(X_test, y_pred, label='Predicciones')
plt.title('Precios Reales vs. Predicciones')
plt.xlabel('Área')
plt.ylabel('Precio')
plt.legend()
plt.show()
# Histograma de precios reales vs. predicciones
plt.figure(figsize=(10, 6))
plt.hist(y_test, bins=20, alpha=0.5, label='Reales')
plt.hist(y_pred, bins=20, alpha=0.5, label='Predicciones')
plt.title('Distribución de Precios Reales vs. Predicciones')
plt.xlabel('Precio')
plt.ylabel('Frecuencia')
plt.legend()
plt.show()
print(f'Pérdida en los datos de prueba: {test_loss}')
6/6 [==============================] - 0s 785us/step
Pérdida en los datos de prueba: 0.9204375743865967