Ich benutze keras, um ein Empfehlungsmodell zu erstellen. Da der Objektsatz ziemlich groß ist, möchte ich die Hits @ N-Metrik als Maß für die Genauigkeit berechnen. Das heißt, wenn der beobachtete Gegenstand im oberen N vorhergesagt ist, zählt er als relevante Empfehlung.Berechnen von Treffern Bei Metrik in Theano
Ich konnte die Treffer bei N-Funktion mit numpy erstellen. Aber da ich versuche, es in eine benutzerdefinierte Verlustfunktion für Keras zu portieren, habe ich ein Problem mit den Tensoren. Insbesondere unterscheidet sich die Aufzählung über einen Tensor. Und als ich in die Syntax schaute, um etwas Entsprechendes zu finden, fing ich an, den ganzen Ansatz in Frage zu stellen. Es ist schlampig und langsam, was meine allgemeine Python-Vertrautheit widerspiegelt.
def hits_at(y_true, y_pred): #numpy version
a=y_pred.argsort(axis=1) #ascending, sort by row, return index
a = np.fliplr(a) #reverse to get descending
a = a[:,0:10] #return only the first 10 columns of each row
Ybool = [] #initialze 2D arrray
for t, idx in enumerate(a):
ybool = np.zeros(num_items +1) #zero fill; 0 index is reserved
ybool[idx] = 1 #flip the recommended item from 0 to 1
Ybool.append(ybool)
A = map(lambda t: list(t), Ybool)
right_sum = (A * y_true).max(axis=1) #element-wise multiplication, then find the max
right_sum = right_sum.sum() #how many times did we score a hit?
return right_sum/len(y_true) #fraction of observations where we scored a hit
Wie soll ich das kompakter und tensorfreundlicher angehen?
Update: Ich konnte eine Version von Top 1 arbeiten. Ich basierte lose auf der GRU4Rec Beschreibung def custom_objective(y_true, y_pred): y_pred_idx_sort = T.argsort(-y_pred, axis=1)[:,0] #returns the first element, which is the index of the row with the largest value y_act_idx = T.argmax(y_true, axis=1)#returns an array of indexes with the top value return T.cast(-T.mean(T.nnet.sigmoid((T.eq(y_pred_idx_sort,y_act_idx)))), theano.config.floatX)
Ich hatte gerade das Feld der Top-1 Prognosen zu der Anordnung der Istdaten elementweise zu vergleichen. Und Theano hat dafür eine eq() -Funktion.
Ich verwende derzeit categorical_crossentropy; Ich bin nicht vertraut mit "Logverlust mit Top N". Geht es darum, http://deeplearning.net/tutorial/logreg.html#the-model irgendwie zu erweitern? –
Ich habe meinen Kommentar aktualisiert –
Hrm, es scheint, dass y_pred und y_true eigentlich Tensoren sind, und nicht numpy Arrays. das macht es etwas komplizierter, weil das Finden von Domenten und das Iterieren von ihnen komplizierter sind, als dasselbe für ein numpiges Array zu tun. –