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.]
사전에 감사.
출력 레이어에서 선형 활성화 (기본값)를 사용하고 있지만 Sigmoid를 사용해야합니다. 도와 줘야 해. –
당신은 절대적으로 옳습니다. 고맙습니다. – lmpeixoto
나는 그것이 효과가있어 기쁘다. 나는 그것이 충분할 지 확신하지 못했다. 나는 이것을 답으로 쓸 것이다. –