Wie gehe ich mit einer Mischung aus binären und kontinuierlichen Eingaben in neuronalen Netzen um?

14

Ich verwende das nnet-Paket in R, um zu versuchen, eine ANN zu erstellen, um die Immobilienpreise für Eigentumswohnungen vorherzusagen (persönliches Projekt). Ich bin neu in diesem Bereich und habe keinen mathematischen Hintergrund.

Ich habe Eingabevariablen, die sowohl binär als auch stetig sind. Zum Beispiel wurden einige Binärvariablen, die ursprünglich Ja / Nein waren, für das neuronale Netz in 1/0 konvertiert. Andere Variablen sind stetig wie Sqft.

Beispiel für Eingabedaten

Ich habe alle Werte auf eine Skala von 0-1 normiert. Vielleicht Bedroomsund Bathroomssollte nicht normalisiert werden, da ihr Bereich nur 0-4 ist?

Stellen diese gemischten Eingänge ein Problem für den ANN dar? Ich habe gute Ergebnisse erzielt, aber bei näherer Betrachtung scheinen die von der ANN für bestimmte Variablen gewählten Gewichte keinen Sinn zu ergeben. Mein Code ist unten, irgendwelche Vorschläge?

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)

UPDATE: Basierend auf den Kommentaren unten zum Aufteilen der Binäreingaben in separate Felder für jede Wertklasse sieht mein Code jetzt folgendermaßen aus:

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)

Die versteckten Knoten im obigen Code sind 12, aber ich habe eine Reihe von versteckten Knoten von 3 bis 25 ausprobiert und alle liefern schlechtere Ergebnisse als die ursprünglichen Parameter, die ich oben im veröffentlichten Originalcode hatte. Ich habe es auch mit linearer Ausgabe versucht = wahr / falsch.

Ich vermute, dass ich die Daten auf andere Weise an nnet weiterleiten muss, da dies die Binäreingabe nicht richtig interpretiert. Entweder das, oder ich muss ihm andere Parameter geben.

Irgendwelche Ideen?

ChrisArmstrong
quelle
1
Die Standardmethode für die Verwendung von binären oder kategorialen Daten als neuronale Netzeingaben besteht darin, das Feld auf Indikatorvektoren zu erweitern. Wenn Sie beispielsweise ein Feld hätten, das Werte von 1,2 oder 3 annehmen könnte, würde eine 1 zu [1,0,0], 2 -> [0,1,0] und 3 -> [ 0,0,1]. Eingaben mit echtem Wert werden im Allgemeinen unverändert beibehalten.
user1149913
1
Nun, da Sie dies erwähnen, erinnere ich mich an eine Lektüre während meiner Suche nach einer Antwort. Da sich die Informationsquelle also in einer CSV-Datei befindet, muss ich tatsächlich Spalten hinzufügen, um die neuen Felder für jeden Binäreingang aufzunehmen? Wenn beispielsweise die Eingabe für das Schlafzimmer im Bereich von 0 bis 4 liegt, würde ich in Ihrem obigen Beispiel 4 zusätzliche Spalten erstellen (insgesamt 5, da "0" für das Schlafzimmer "Studio" steht) und eine 3BR-Wohnung würde als 0,0,0,1 ausgedrückt , 0?
ChrisArmstrong

Antworten:

8

Eine Möglichkeit, mit dieser Situation umzugehen, besteht darin, die Eingaben so zu skalieren, dass ihre Varianzen in etwa im selben Maßstab liegen. Dieser Rat wird im Allgemeinen für die Regressionsmodellierung gegeben, gilt jedoch in Wirklichkeit für alle Modellierungssituationen, in denen Variablen verwendet werden, die auf verschiedenen Skalen gemessen werden. Dies liegt daran, dass sich die Varianz einer binären Variablen häufig stark von der Varianz einer stetigen Variablen unterscheidet. Gelman und Hill (2006) empfehlen, kontinuierliche Eingaben um zwei Standardabweichungen neu zu skalieren, um eine Parität mit (nicht skalierten) Binäreingaben zu erzielen. Diese Empfehlung spiegelt sich auch in einem Artikel und einem Blogbeitrag wider .

Eine spezifischere Empfehlung für neuronale Netze besteht darin, "Effektcodierung" für Binäreingänge (dh -1 und 1) anstelle von "Scheincodierung" (0 und 1) zu verwenden und den zusätzlichen Schritt des Zentrierens kontinuierlicher Variablen durchzuführen. Diese Empfehlungen stammen aus einer umfangreichen FAQ von Warren Sarle, insbesondere aus den Abschnitten "Warum nicht Binäreingänge als 0 und 1 codieren?" und "Soll ich die Eingabevariablen standardisieren?" Das Wesentliche ist jedoch dasselbe:

Der Beitrag eines Inputs hängt stark von seiner Variabilität im Vergleich zu anderen Inputs ab.

Ungeordnete kategoriale Variablen müssen in binäre Indikatoren aufgeteilt werden. Sie sind sonst einfach nicht aussagekräftig.

Shadowtalker
quelle