2017-10-13 1 views
1

Je travaille sur un problème de régression. Une des métriques de performance pour ce problème est la "précision de signe", ce qui signifie que je veux voir si la valeur de prédiction a le même signe de la vraie valeur. Je sais que mse pourrait en quelque sorte montrer la proximité entre la valeur prédite et la vraie valeur, mais j'aimerais voir la précision du signe lors de la validation. Pour être plus précis, après l'entraînement, j'utilise la méthode ci-dessous pour vérifier la précision. Ce que je veux personnaliser les métriques est de réaliser le chemin ci-dessous lors de la validation. (np.multiply(predict_label,test_label)>0).sum()/float(predict_label.shape[0])Mesures personnalisées dans keras pour évaluer la prédiction des signes

Répondre

0

Vous pouvez la mettre en œuvre de manière similaire à la précision:

def sign_accuracy(y_true, y_pred): 
    return K.mean(K.greater(y_true * y_pred, 0.), axis=-1) 

Pour le tester:

y_true = np.random.rand(5, 1) - 0.5 
y_pred = np.random.rand(5, 1) - 0.5 
acc = K.eval(sign_accuracy(K.variable(y_true), K.variable(y_pred))) 

print(y_true) 
[[ 0.20410185] 
[ 0.12085985] 
[ 0.39697642] 
[-0.28178138] 
[-0.37796012]] 

print(y_pred) 
[[-0.38281826] 
[ 0.14268927] 
[ 0.19218624] 
[ 0.21394845] 
[ 0.04044269]] 

print(acc) 
[ 0. 1. 1. 0. 0.] 

La moyenne sur l'axe 0 est prise automatiquement par Keras lorsque vous appelez fit() ou evaluate(), vous n'avez donc pas besoin de totaliser acc et le diviser par y_pred.shape[0].

Cette mesure peut également être appliquée aux variables multidimensionnelles:

y_true = np.random.rand(5, 3) - 0.5 
y_pred = np.random.rand(5, 3) - 0.5 
acc = K.eval(sign_accuracy(K.variable(y_true), K.variable(y_pred))) 

print(y_true) 
[[ 0.02745352 -0.27927986 -0.47882833] 
[-0.40950793 -0.16218984 0.19184008] 
[ 0.25002487 -0.08455175 -0.03606459] 
[ 0.09315503 -0.19825522 0.19801222] 
[-0.32129431 -0.02256616 0.47799333]] 

print(y_pred) 
[[-0.06733171 0.18156806 0.28396574] 
[ 0.04054056 -0.45898607 -0.10661648] 
[-0.05162396 -0.34005141 -0.25910923] 
[-0.26283177 0.01532359 0.33764032] 
[ 0.2754057 0.26896232 0.23089488]] 

print(acc) 
[ 0.   0.33333334 0.66666669 0.33333334 0.33333334] 
+0

Pour le premier cas, vous donnez, peut être la sortie désirée '40%' 'ou 0.4'? Voulez-vous dire que si je mets ce 'sign_accuracy' à la commande' model.compile (optimizer = 'adam', perte = 'mae', metrics = [sign_accuracy]) ', j'obtiendra' 0.4'? – Wedoso

+0

Oui. Keras prend la moyenne en interne. –