2017-10-11 73 views
1

我有一个前馈DNN模型,有几个图层来执行二进制分类。输出层是1 sigmoid单位和损失函数binary_crossentropy。作为预测,我期望一个带有零/一个的矢量。为此,我围绕预测并对他们进行打击。然后我使用sklearn分数函数来计算(f1score,rocauc,precision,recall,mcc)。问题是我得到的预测向量与我假装的单热编码不匹配。尽管如果我使用一个mse损失函数,它就像假装一样工作。Keras二进制分类压扁输出为零/一个

=>模型创建功能:

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 

=>评价函数:预先

[-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.] 

感谢:

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

您正在输出层使用线性激活(默认),而您应该采用sigmoid。应该帮助。 –

+0

你是对的。非常感谢你。 – lmpeixoto

+0

我很高兴它的工作,我不知道它会足够。我会把它作为答案。 –

回答

0

您在输出图层中使用线性激活(默认),而您应该采用sigmoid。