mardi 14 juin 2016

Balanced Error Rate as metric function

I am trying to solve a binary classification problem with the sequential model from Keras
and have to meet a given Balanced Error Rate (BER)

So I thought it would be a good idea to use the BER instead of accuracy as. metric

My custom metric implementation for BER looks like this:

def balanced_error_rate(y_true, y_pred):
    labels = theano.shared(np.asmatrix([[0, 1]], dtype='int8'))
    label_matrix = K.repeat_elements(labels, K.shape(y_true)[0], axis=1)
    true_matrix = K.repeat_elements(y_true, K.shape(labels)[0], axis=1)
    pred_matrix = K.repeat_elements(K.round(y_pred), K.shape(labels)[0], axis=1)

    class_lens = K.sum(K.equal(label_matrix, true_matrix), axis=1)
    return K.sum(K.sum(class_lens - K.sum(K.equal(label_matrix, K.not_equal(true_matrix,pred_matrix)), axis=1), axis=0)/class_lens, axis=0)/2

The idea is to create a matrix from the available labels and compare it to the input data (then sum the ones) to get the number of elements of this label....

My problem is that:

> K.shape(y_true) 
Shape.0    


> Typeinfo:

> type(y_true)
<class 'theano.tensor.var.TensorVariable'>

> type(K.shape(y_true))
<class 'theano.tensor.var.TensorVariable'>

...and I can't find out why.


I am now looking for:

A way to get the array dimensions / an explanation why shape acts like it does / the reason why y_true seems to have 0 dimensions

or

A method to create a tensor matrix with a given with/height by repeating a given row/column vector.

or

A smarter solution to calculate the BER using tensor functions.

Aucun commentaire:

Enregistrer un commentaire