#!/usr/bin/env python # coding: utf-8 # # ¿Cuánto cree la IA que vale tu casa? - Parte III # # 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? # ![full_rnn.png](attachment:full_rnn.png) # ## Redes Neuronales # #### Funciones de activación # 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. # # #### Pesos internos # 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. # # #### Neuronas # 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. # # ![neuron.png](attachment:neuron.png) # 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. # ## Construyendo un modelo con Keras para predecir el precio de la vivienda # #### Importar librerías # In[10]: import matplotlib.pyplot as plt import pandas as pd # #### Cargar datos preprocesados # In[11]: train_df = pd.read_csv('train.csv') test_df = pd.read_csv('test.csv') val_df = pd.read_csv('val.csv') # #### Separar características # In[12]: 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 # #### Definir el modelo # In[13]: 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') # #### Entrenamiento # In[14]: 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) # #### Visualización de resultados # In[15]: # 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}') # ## Expermentando con distintas funciones de activación en la capa de salida # In[16]: 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') # In[17]: 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) # In[18]: # 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}')