2017-10-11 11 views
1

バイナリ分類を実行するために、いくつかのレイヤを備えたフィードフォワードDNNモデルがあります。出力層は1シグモイド単位であり、損失関数はbinary_crossentropyである。予測として、私はゼロ/ 1のベクトルを期待しています。そのために、私は予測をラウンドし、それらをラブします。次に、sklearnスコア関数を使って(f1score、rocauc、precision、recall、mcc)を計算します。問題は、私がふりをすると、ワンホットエンコーディングと一致しない予測ベクトルが得られることです。 mse loss関数を使用すると、それはふりをしたものとして機能しますが。Kerasバイナリ分類スカッシュをゼロ/ 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

出力層で線形活性化(デフォルト)を使用していますが、シグモイドを使用する必要があります。助けてください。 –

+0

あなたは絶対に正しいです。どうもありがとうございました。 – lmpeixoto

+0

私はそれがうまくいきました、私はそれが十分であると確信していませんでした。私は答えとしてそれを入れます。 –

答えて

0

出力層で線形活性化(デフォルト)を使用していますが、シグモイドを使用する必要があります。

関連する問題