Keras Deep Learning: predicción del precio de la vivienda mediante redes neuronales

¡Acostúmbrate a escribir juntos! Este es el día 18 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

pronóstico del precio de la vivienda

En esta sección, estudiaremos el problema de la producción continua tratando de predecir el precio de una casa. Usando el conjunto de datos de Bostonprecios de la vivienda , tome como entrada 13 variables que pueden afectar los precios de la vivienda. Nuestro objetivo es minimizar el error en nuestras predicciones de los precios de las viviendas. Explore las aplicaciones prácticas de las redes neuronales.

Dado que el objetivo es minimizar el error, definimos el error a minimizar: el error absoluto o también el error cuadrático. Ahora que tenemos un objetivo para optimizar, definamos una estrategia para resolver este problema:

  • Normalice el conjunto de datos de entrada, escalando el rango de todas las variables para que esté entre 0-1.
  • Dividir los datos dados en conjuntos de datos de entrenamiento y prueba.
  • El modelo utiliza una capa oculta.
  • Compile el modelo utilizando el optimizador de Adam y defina la función de pérdida como el valor de error absoluto medio.
  • Ajuste el modelo.
  • Hacer predicciones sobre el conjunto de datos de prueba.
  • Calcule el error en las predicciones en el conjunto de datos de prueba.

Hemos definido el método del modelo, a continuación, lo implementamos en el código de .

  1. Importe los conjuntos de datos relevantes:
from keras.datasets import boston_housing
import numpy as np
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
复制代码
  1. Normalice los conjuntos de datos de entrada y salida para que todas las variables oscilen entre cero y uno:
max_target = np.max(train_targets)
train_data2 = train_data/np.max(train_data,axis=0)
test_data2 = test_data/np.max(train_data,axis=0)
train_targets = train_targets/max_target
test_targets = test_targets/max_target
复制代码

Normalizamos el conjunto de datos de prueba con el valor máximo en el conjunto de datos de entrenamiento, ya que no se deben usar valores en el conjunto de datos de prueba durante la construcción del modelo.

  1. Con los conjuntos de datos de entrada y salida listos, defina el modelo:
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
from keras.regularizers import l1

model = Sequential()
model.add(Dense(64, input_dim=13, activation='relu', kernel_regularizer=l1(0.1)))
model.add(Dense(1, activation='relu', kernel_regularizer=l1(0.1)))
model.summary()
复制代码

La breve salida de información del modelo es la siguiente:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
dense (Dense)                (None, 64)                896      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 65       
=================================================================
Total params: 961
Trainable params: 961
Non-trainable params: 0
_________________________________________________________________
复制代码

Realizamos la L1regularización del modelo para que el modelo no se sobreajuste (la cantidad de puntos de datos en los datos de entrenamiento es pequeña).

  1. Compile el modelo para minimizar el valor de error absoluto medio:
model.compile(loss='mean_absolute_error', optimizer='adam')
复制代码
  1. Finalmente, ajuste el modelo:
history = model.fit(train_data2,
                    train_targets,
                    validation_data=(test_data2, test_targets),
                    epochs=100,
                    batch_size=64,
                    verbose=1)
复制代码
  1. Calcule e imprima el error absoluto medio en el conjunto de datos de prueba:
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
复制代码

Se puede ver que el error absoluto medio es de aprox 7.7.

7.670271360777928
复制代码

En la siguiente sección, aprenderá a utilizar una función de pérdida personalizada para reducir aún más el valor de error absoluto medio.

Usar una función de pérdida personalizada

En la sección anterior, utilizamos una función de pérdida de error absoluta media predefinida para realizar la optimización objetiva. En esta sección, aprenderemos a definir una función de pérdida personalizada usando .

La función de pérdida personalizada que usaremos es un valor de error cuadrático medio modificado, donde el error es la diferencia entre la raíz cuadrada del valor real y la raíz cuadrada del valor predicho. La función de pérdida personalizada se define de la siguiente manera:

def loss_function(y_true, y_pred):
    return K.square(K.sqrt(y_pred) - K.sqrt(y_true))
复制代码

A continuación, compile el modelo utilizando el mismo conjunto de datos de entrada y salida y el modelo de red neuronal que en la sección anterior utilizando una función de pérdida personalizada durante el ajuste:

model.compile(loss=loss_function, optimizer='adam')
复制代码

En el código anterior, definimos la función de pérdida como una función de pérdida personalizada loss_function, finalmente ajustamos el modelo y calculamos el valor de pérdida del modelo en el conjunto de datos de prueba.

history = model.fit(train_data2, train_targets,
                    validation_data=(test_data2, test_targets),
                    epochs=100,
                    batch_size=64,
                    verbose=1)
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
复制代码

Después de ajustar el modelo, puede ver que el error absoluto medio es aprox 6.6., que es un poco más pequeño que usar la función de mean_absolute_errorpérdida :

6.566271535383652
复制代码

Supongo que te gusta

Origin juejin.im/post/7088693496931958797
Recomendado
Clasificación