2017-11-08 20 views
2

그래서 1000 행 6 열의 데이터 프레임이 있습니다. 세 개의 열은 범주 형 변수이고 2는 연속 형입니다. 마지막 열은 1과 0의 값으로 예측하려고하는 것입니다.Keras의 범주 형 변수에 대한 포함 문제

keras를 사용하여 범주 형 변수에 대한 포함, 모든 연속 변수에 대한 조밀 한 계층을 결합하여 모델을 데이터에 적합 시키려고합니다. .

내가 한 첫번째 일은 레이블이 범주 형 변수를 인코딩 한 것입니다.

은 그 때 나는 모델을 만들기 위해 다음과 같이 범주 변수를 통해 루프와 목록에 추가 다음과 같다 : -

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) 

그리고 연속 변수

: -

for i in df[cont_vars]: 

s = Sequential() 

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

models_concat.append(s) 

그럼 난 시도 다음과 같이 이들을 연결하고 네트워크를 구축했습니다. -

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']) 

하지만 모델은 다음과 같습니다 : -

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

내가받을 다음과 같은 오류 : -

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

일어나고 어떻게이 문제를 해결할 수 있는지에 관해서는 어떤 생각.

P.S은 -> 나는이 방법은 물건을 할 수있는 올바른 방법입니다 확실하지 않다, 나는이 논문에서 다음과 같이 범주에 사용 묻어 실험을 시도했다 : -

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

감사합니다.

+0

여러 개의 입력 레이어를 만드는 for 루프가 있습니까? – DJK

+0

내 대답이 도움이 되었습니까? –

답변

0

교육 데이터를 5 numpy.array (모델에 5 가지 입력이 있음)으로 나누는 것만 큼 간단해야합니다. 다음 코드를 시도해보십시오.

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