¿Cómo lidiar con una combinación de entradas binarias y continuas en redes neuronales?

14

Estoy usando el paquete nnet en R para intentar construir un ANN para predecir los precios inmobiliarios de condominios (proyecto personal). Soy nuevo en esto y no tengo experiencia en matemáticas, así que por favor, descuida conmigo.

Tengo variables de entrada que son binarias y continuas. Por ejemplo, algunas variables binarias que originalmente eran sí / no se convirtieron a 1/0 para la red neuronal. Otras variables son continuas como Sqft.

Muestra de datos de entrada.

He normalizado todos los valores para que estén en una escala de 0-1. ¿Tal vez Bedroomsy Bathroomsno debería normalizarse ya que su rango es solo 0-4?

¿Estas entradas mixtas presentan un problema para el ANN? He obtenido buenos resultados, pero después de un examen más detallado, los pesos que el ANN ha elegido para ciertas variables no parecen tener sentido. Mi código está abajo, ¿alguna sugerencia?

ANN <- nnet(Price ~ Sqft + Bedrooms + Bathrooms + Parking2 + Elevator + 
            Central.AC + Terrace + Washer.Dryer + Doorman + Exercise.Room + 
            New.York.View,data[1:700,], size=3, maxit=5000, linout=TRUE, decay=.0001)

ACTUALIZACIÓN: Según los comentarios a continuación sobre la separación de las entradas binarias en campos separados para cada clase de valor, mi código ahora se ve así:

ANN <- nnet(Price ~ Sqft + Studio + X1BR + X2BR + X3BR + X4BR + X1Bath
        + X2Bath + X3Bath + X4bath + Parking.Yes + Parking.No + Elevator.Yes + Elevator.No 
        + Central.AC.Yes + Central.AC.No + Terrace.Yes + Terrace.No + Washer.Dryer.Yes 
        + Washer.Dryer.No + Doorman.Yes + Doorman.No + Exercise.Room.Yes + Exercise.Room.No 
        + New.York.View.Yes + New.York.View.No + Healtch.Club.Yes + Health.Club.No,
    data[1:700,], size=12, maxit=50000, decay=.0001)

Los nodos ocultos en el código anterior son 12, pero he intentado un rango de nodos ocultos de 3 a 25 y todos dan peores resultados que los parámetros originales que tenía anteriormente en el código original publicado. También lo he intentado con salida lineal = verdadero / falso.

Supongo que necesito alimentar los datos a nnet de una manera diferente porque no está interpretando la entrada binaria correctamente. O eso, o necesito darle diferentes parámetros.

¿Algunas ideas?

ChrisArmstrong
fuente
1
La forma estándar de usar datos binarios o categóricos como entradas de red neuronal es expandir el campo a los vectores indicadores. Por ejemplo, si tuviera un campo que pudiera tomar valores 1,2 o 3, entonces un 1 se expandiría a [1,0,0], 2 -> [0,1,0] y 3 -> [ 0,0,1]. La entrada de valor real generalmente se mantiene tal cual.
user1149913
1
Ahora que mencionas esto, parece recordar haber leído esto en alguna parte durante mi búsqueda de una respuesta. Entonces, dado que la fuente de información está en un archivo csv, ¿realmente necesito agregar columnas para acomodar los nuevos campos para cada entrada binaria? Por ejemplo, si la entrada de la habitación oscila entre 0-4, usando su ejemplo anterior, crearía 4 columnas adicionales (un total de 5 ya que '0' habitaciones significa estudio) y un condominio 3BR se expresaría como 0,0,0,1 , 0?
ChrisArmstrong

Respuestas:

8

Una forma de manejar esta situación es reescalar las entradas para que sus variaciones sean aproximadamente de la misma escala. Este consejo generalmente se da para el modelado de regresión, pero realmente se aplica a todas las situaciones de modelado que involucran variables medidas en diferentes escalas. Esto se debe a que la varianza de una variable binaria es a menudo bastante diferente de la varianza de una variable continua. Gelman y Hill (2006) recomiendan reescalar entradas continuas por dos desviaciones estándar para obtener paridad con entradas binarias (sin escala). Esta recomendación también se refleja en una publicación en papel y blog .

Una recomendación más específica para las redes neuronales es usar "codificación de efectos" para entradas binarias (es decir, -1 y 1) en lugar de "codificación ficticia" (0 ​​y 1), y dar el paso adicional de centrar variables continuas. Estas recomendaciones provienen de un extenso FAQ de Warren Sarle, en particular las secciones "¿Por qué no codificar entradas binarias como 0 y 1?" y "¿Debo estandarizar las variables de entrada?" La esencia, sin embargo, es la misma:

La contribución de una entrada dependerá en gran medida de su variabilidad en relación con otras entradas.

En cuanto a las variables categóricas desordenadas, debe dividirlas en indicadores binarios. Simplemente no tienen sentido de lo contrario.

Shadowtalker
fuente