2017-10-11 5 views
1

바이너리 분류를 수행 할 수있는 여러 레이어가있는 피드 포워드 DNN 모델이 있습니다. 출력 계층은 1 시그 모이 드 단위이고 손실 함수는 binary_crossentropy입니다. 예상대로 나는 0/1 벡터를 기대합니다. 그것을 위해 나는 예측을 반올림하고 그들을 문지르십시오. 그런 다음 sklearn 점수 함수를 사용하여 (f1score, rocauc, precision, recall, mcc)를 계산합니다. 문제는 내가 가장하는 한 번의 핫 인코딩과 일치하지 않는 예측 벡터를 얻는 것입니다. mse 손실 기능을 사용하면 척으로 작동합니다. Keras 이진 분류 스쿼시가 0/1로 출력됩니다.

는 => 모델 작성 기능 :

def create_DNN_model(self, verbose=True): 
     print("Creating DNN model") 
     fundamental_parameters = ['dropout', 'output_activation', 'optimization', 'learning_rate', 
           'units_in_input_layer', 
           'units_in_hidden_layers', 'nb_epoch', 'batch_size'] 
     for param in fundamental_parameters: 
      if self.parameters[param] == None: 
       print("Parameter not set: " + param) 
       return 
     self.print_parameter_values() 
     model = Sequential() 
     # Input layer 
     model.add(Dense(self.parameters['units_in_input_layer'], input_dim=self.feature_number, activation='relu')) 
     model.add(BatchNormalization()) 
     model.add(Dropout(self.parameters['dropout'])) 
     # constructing all hidden layers 
     for layer in self.parameters['units_in_hidden_layers']: 
      model.add(Dense(layer, activation='relu')) 
      model.add(BatchNormalization()) 
      model.add(Dropout(self.parameters['dropout'])) 
     # constructing the final layer 
     model.add(Dense(1)) 
     model.add(Activation(self.parameters['output_activation'])) 
     if self.parameters['optimization'] == 'SGD': 
      optim = SGD() 
      optim.lr.set_value(self.parameters['learning_rate']) 
     elif self.parameters['optimization'] == 'RMSprop': 
      optim = RMSprop() 
      optim.lr.set_value(self.parameters['learning_rate']) 
     elif self.parameters['optimization'] == 'Adam': 
      optim = Adam() 
     elif self.parameters['optimization'] == 'Adadelta': 
      optim = Adadelta() 
     model.add(BatchNormalization()) 
     model.compile(loss='binary_crossentropy', optimizer=optim, metrics=[matthews_correlation]) 
     if self.verbose == 1: str(model.summary()) 
     print("DNN model sucessfully created") 
     return model 

=> 평가 함수 :

def evaluate_model(self, X_test, y_test): 
     print("Evaluating model with hold out test set.") 
     y_pred = self.model.predict(X_test) 
     y_pred = [float(np.round(x)) for x in y_pred] 
     y_pred = np.ravel(y_pred) 
     scores = dict() 
     scores['roc_auc'] = roc_auc_score(y_test, y_pred) 
     scores['accuracy'] = accuracy_score(y_test, y_pred) 
     scores['f1_score'] = f1_score(y_test, y_pred) 
     scores['mcc'] = matthews_corrcoef(y_test, y_pred) 
     scores['precision'] = precision_score(y_test, y_pred) 
     scores['recall'] = recall_score(y_test, y_pred) 
     scores['log_loss'] = log_loss(y_test, y_pred) 
     for metric, score in scores.items(): 
      print(metric + ': ' + str(score)) 
     return scores 

=> 예측값은 'y_pred'

[-1. -1. 2. -0. 2. -1. -1. -1. 2. -1. -1. 2. -1. 2. -1. 2. -1. -1. 2. -1. 2. -1. -1. 2. -1. 2. 2. 2. -1. -1. 2. 2. 2. 2. -1. -1. 2. 2. 2. -1. 2. 2. -1. 2. -1. -1. -1. 1. -1. -1. -1.] 

사전에 감사.

+1

출력 레이어에서 선형 활성화 (기본값)를 사용하고 있지만 Sigmoid를 사용해야합니다. 도와 줘야 해. –

+0

당신은 절대적으로 옳습니다. 고맙습니다. – lmpeixoto

+0

나는 그것이 효과가있어 기쁘다. 나는 그것이 충분할 지 확신하지 못했다. 나는 이것을 답으로 쓸 것이다. –

답변

0

출력 레이어에서 선형 활성화 (기본값)를 사용하는 반면, Sigmoid를 사용해야합니다.

관련 문제