Наказание ложных негативов в задаче бинарной классификации - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь штрафовать ложных негативов больше, чем ложных в задаче бинарной классификации.

Пользовательская функция потерь выглядит следующим образом: вдохновлено здесь

def w_categorical_crossentropy(y_true, y_pred, weights):
    nb_cl = len(weights)
    final_mask = K.zeros_like(y_pred[:, 0])
    y_pred_max = K.max(y_pred, axis=1)
    y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1))
    y_pred_max_mat = K.cast(K.equal(y_pred, y_pred_max), K.floatx())
    for c_p, c_t in product(range(nb_cl), range(nb_cl)):
        final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
    return K.categorical_crossentropy(y_pred, y_true) * final_mask

Ниже приведены веса, передаваемые параметру весов в вышеуказанной функции:

w_array = np.ones((2,2))
w_array[1,0] = 2.5 # penalizing FN
w_array[0,1] = 2.5 # penalizing FP

В моем понимании, первая строка штрафует FN, а вторая штрафует FP.Когда я пытаюсь запустить этот код, число FN / FP почти такое же, как и в случае с равными весами, как показано ниже

w_array = np.ones((2,2))
#w_array[1,0] = 2.5 # penalizing FN
#w_array[0,1] = 2.5 # penalizing FP

СЛЕДОВАТЬ ЗА: Если я просто закомментирую второе назначение вw_array, значит ли это, что я наказываю только FN, а не FP?Что здесь важного final_mask?

Вызов и использование функции:

loss = lambda y_true, y_pred: w_categorical_crossentropy(y_true, y_pred, weights=w_array)

classifier.compile(optimizer = sgd, loss = loss, metrics = ['accuracy'])
...