2017-11-08 3 views
2

So habe ich einen Datenrahmen mit 1000 Zeilen und 6 Spalten. drei Spalten sind kategorische Variablen und 2 sind kontinuierlich. Die letzte Spalte ist das, was ich versuche vorherzusagen, wie Werte 1 und 0.Probleme mit Einbettungen für kategorische Variablen in Keras

Ich versuche Keras zu verwenden, um Einbettungen für die kategorialen Variablen, eine dichte Schicht für jede kontinuierliche Variable zu erstellen, sie zu verketten und das Modell an die Daten anzupassen .

Das erste, was ich getan habe, war die kategorisierten Variablen codiert.

Dann geschleift ich über die kategorische Variablen als ein Modell zu erstellen, folgt und zu einer Liste angehängt, wie folgt: -

models_concat = [] 

for k in df[categorical_columns]: 

s = Sequential() 

s.add(Embedding(len(df[k].unique()), 5, input_length = 1, embeddings_regularizer = l2(1e-2))) 

s.add(Flatten()) 

models_concat.append(s) 

Und für die kontinuierliche Variablen: -

for i in df[cont_vars]: 

s = Sequential() 

s.add(Dense(1, input_dim = 1)) 

models_concat.append(s) 

Dann habe ich versucht, sie verketten wie folgt und baute das Netzwerk: -

model_emb = Sequential() 

model_emb.add(Merge(models_concat, mode='concat')) 

model_emb.add(Dropout(0.02)) 

model_emb.add(Dense(units=100, kernel_initializer= trunc_normal)) 

model_emb.add(Dropout(0.25)) 

model_emb.add(BatchNormalization()) 

model_emb.add(Activation('relu')) 

model_emb.add(Dense(units=100, kernel_initializer = trunc_normal)) 

model_emb.add(Dropout(0.2)) 

model_emb.add(BatchNormalization()) 

model_emb.add(Activation('relu')) 

model_emb.add(Dense(units=50, kernel_initializer = trunc_normal)) 

model_emb.add(Dropout(0.1)) 

model_emb.add(BatchNormalization()) 

model_emb.add(Activation('relu')) 

model_emb.add(Dense(units=1, kernel_initializer = trunc_normal)) 

model_emb.add(Activation('sigmoid')) 

model_emb.compile(optimizer='adagrad',loss='binary_crossentropy',metrics=['accuracy']) 

Aber wenn ich versuche passen das Modell wie folgt: -

model_emb.fit(train_x,train_y,epochs = 20,validation_split = 0.3,batch_size = 64) 

Ich erhalte die folgende Fehlermeldung: -

ValueError: The model expects 5 input arrays, but only received one array. Found: array with shape (1000, 5).

Jede Idee, was passiert und wie ich dieses Problem beheben könnte.

P. S -> Ich bin mir nicht sicher, dass diese Methode der richtige Weg ist Dinge zu tun, ich hatte versucht, mit Einbettungen in kategorischen zu experimentieren, wie in diesem Papier gefolgt: -

https://arxiv.org/pdf/1604.06737.pdf

Dank.

+0

Schwer zu folgen, sind die for-Schleifen mehrere Eingabeebenen machen? – DJK

+0

Hat meine Antwort Ihnen geholfen? –

Antwort

0

Dies sollte so einfach sein wie die Aufteilung Ihrer Trainingsdaten in eine Liste von 5 numpy.array s (da Ihr Modell 5 verschiedene Eingänge hat). Versuchen Sie den folgenden Code:

train_x = [train_x[:, [i]] for i in range(5)] 
Verwandte Themen