2016-11-04 1 views
1

Bitte verzeih mir mein gebrochenes Englisch. Dies ist der Code.Was bedeutet dieser Codeabschnitt für die Berechnung von auc in ctr-Vorhersage?

def scoreClickAUC(num_clicks, num_impressions, predicted_ctr): 
    """ 
    Calculates the area under the ROC curve (AUC) for click rates 

    Parameters 
    ---------- 
    num_clicks : a list containing the number of clicks 

    num_impressions : a list containing the number of impressions 

    predicted_ctr : a list containing the predicted click-through rates 

    Returns 
    ------- 
    auc : the area under the ROC curve (AUC) for click rates 
    """ 
    i_sorted = sorted(range(len(predicted_ctr)),key=lambda i: predicted_ctr[i], 
         reverse=True) 
    auc_temp = 0.0 
    click_sum = 0.0 
    old_click_sum = 0.0 
    no_click = 0.0 
    no_click_sum = 0.0 

    # treat all instances with the same predicted_ctr as coming from the 
    # same bucket 
    last_ctr = predicted_ctr[i_sorted[0]] + 1.0 

    for i in range(len(predicted_ctr)): 
     if last_ctr != predicted_ctr[i_sorted[i]]: 
      auc_temp += (click_sum+old_click_sum) * no_click/2.0 
      old_click_sum = click_sum 
      no_click = 0.0 
      last_ctr = predicted_ctr[i_sorted[i]] 
     no_click += num_impressions[i_sorted[i]] - num_clicks[i_sorted[i]] 
     no_click_sum += num_impressions[i_sorted[i]] - num_clicks[i_sorted[i]] 
     click_sum += num_clicks[i_sorted[i]] 
    auc_temp += (click_sum+old_click_sum) * no_click/2.0 
    auc = auc_temp/(click_sum * no_click_sum) 
    return auc 

Ich bin verwirrt mit der Bedeutung des Absatzes "(click_sum + old_click_sum) * no_click/2.0" .please mir zu helfen.

+0

Es bedeutet, nehmen Sie den Durchschnitt des aktuellen Wertes von 'click_sum' und seinen vorherigen Wert (von der vorherigen' i' Schleife), und multiplizieren Sie dann den Durchschnitt mit 'no_click'. Beantwortet das deine Frage? Wenn nicht, bitte klären Sie durch Aktualisierung Ihrer Frage, um genauer zu sein :) – elfan

+0

Danke für Ihren Kommentar. Aber warum die Summe von "(click_sum + old_click_sum) * no_click/2.0" über "(click_sum * no_click_sum)" bekommen auc? Ich bin verwirrt. –

Antwort

0

Die Fläche unter der Kurve ist linear interpoliert, wenn mehr als ein Punkt hat die exakt gleiche vorhergesagte Punktzahl.

Die Gleichung Sie ist die Fläche einer Scheibe zu sehen, die wie folgt aussieht:

/
    /| 
/| 
/| 
| | 
| | 
+--+ 

Die hierfür sind als durchschnittliche Höhe berechnet werden * width = (height_left + height_right) + Breite/2

+0

Die x-Achse der Roc-Kurve ist fp und die y-Achse ist tp, so dass diese Scheibe der Breite der Fläche der Wert der falschen positiven Rate ist? –

+0

Es ist die * Änderung * in fpr, nicht die Summe fpr. Die Fläche wird berechnet, indem sie bei jeder Änderung in vertikale Scheiben geschnitten wird. –

+0

Vielen Dank. Ich sehe was du meinst. tpr = klick/(click + no_click) und fpr = no_click/(click + no_click). Aber warum ist der letzte Rechenvorgang "auc = auc_temp/(click_sum * no_click_sum)"? Normalerweise ist die Summe des Trapezes auc und wir brauchen nicht "auc = auc_temp/(click_sum * no_click_sum)". –