Como lidar com uma mistura de entradas binárias e contínuas em redes neurais?

14

Estou usando o pacote nnet no R para tentar construir uma ANN para prever preços de imóveis para condomínios (projeto pessoal). Eu sou novo nisso e não tenho formação em matemática, então, por favor, fique comigo.

Eu tenho variáveis ​​de entrada que são binárias e contínuas. Por exemplo, algumas variáveis ​​binárias que eram originalmente sim / não foram convertidas em 1/0 para a rede neural. Outras variáveis ​​são como contínuas Sqft.

Amostra de dados de entrada

Eu normalizei todos os valores em uma escala de 0-1. Talvez Bedroomse Bathroomsnão deva ser normalizado, pois o intervalo é de apenas 0-4?

Essas entradas mistas apresentam um problema para a RNA? Eu obtive bons resultados, mas após uma análise mais detalhada, os pesos que a RNA escolheu para determinadas variáveis ​​não parecem fazer sentido. Meu código está abaixo, alguma sugestão?

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)

ATUALIZAÇÃO: Com base nos comentários abaixo sobre a divisão das entradas binárias em campos separados para cada classe de valor, meu código agora se parece com:

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)

Os nós ocultos no código acima são 12, mas eu tentei um intervalo de nós ocultos de 3 a 25 e todos apresentam resultados piores que os parâmetros originais que eu tinha acima no código original postado. Eu também tentei com saída linear = true / false.

Meu palpite é que eu preciso alimentar os dados para nnet de uma maneira diferente, porque não está interpretando a entrada binária corretamente. Ou isso, ou eu preciso fornecer parâmetros diferentes.

Alguma ideia?

ChrisArmstrong
fonte
1
A maneira padrão de usar dados binários ou categóricos como entradas de redes neurais é expandir o campo para vetores indicadores. Por exemplo, se você tivesse um campo que pudesse assumir valores 1,2 ou 3, um 1 seria expandido para [1,0,0], 2 -> [0,1,0] e 3 -> [ 0,0,1] A entrada com valor real é geralmente mantida como está.
user1149913
1
Agora que você mencionou isso, eu me lembro de ter lido isso em algum lugar durante minha busca por uma resposta. Portanto, como a fonte de informações está em um arquivo CSV, na verdade, preciso adicionar colunas para acomodar os novos campos para cada entrada binária? Por exemplo, se a entrada do quarto variar de 0 a 4, usando o exemplo acima, eu criaria 4 colunas adicionais (total de 5, pois '0' quartos significa estúdio) e um condomínio 3BR seria expresso como 0,0,0,1 0?
26912 ChrisArmstrong

Respostas:

8

Uma maneira de lidar com essa situação é redimensionar os insumos para que suas variações estejam aproximadamente na mesma escala. Esse conselho geralmente é dado para modelagem de regressão, mas realmente se aplica a todas as situações de modelagem que envolvem variáveis ​​medidas em diferentes escalas. Isso ocorre porque a variação de uma variável binária geralmente é bem diferente da variação de uma variável contínua. Gelman e Hill (2006) recomendam o redimensionamento de entradas contínuas por dois desvios-padrão para obter paridade com entradas binárias (sem escala). Essa recomendação também se reflete em uma publicação em papel e blog .

Uma recomendação mais específica para redes neurais é usar "codificação de efeito" para entradas binárias (isto é, -1 e 1) em vez de "codificação fictícia" (0 ​​e 1) e dar o passo adicional de centralizar variáveis ​​contínuas. Essas recomendações vêm de uma extensa FAQ de Warren Sarle, em particular as seções "Por que não codificar entradas binárias como 0 e 1?" e "Devo padronizar as variáveis ​​de entrada?" A essência, no entanto, é a mesma:

A contribuição de uma entrada dependerá fortemente de sua variabilidade em relação a outras entradas.

Quanto às variáveis ​​categóricas não ordenadas - você deve dividi-las em indicadores binários. Eles simplesmente não são significativos de outra maneira.

shadowtalker
fonte