2015-11-11 19 views
10

Könnte jemand erklären, wie die Spalte Quality im xgboost R-Paket in der xgb.model.dt.tree-Funktion berechnet wird?Wie wird die Qualität von xgboost berechnet?

In der Dokumentation heißt es, dass Quality "ist die Verstärkung in Bezug auf die Aufteilung in diesem spezifischen Knoten".

Wenn Sie den folgenden Code ausführen, für diese Funktion in der xgboost Dokumentation gegeben, Quality für Knoten 0 von Baum 0 4000,53, aber ich berechnen die Gain als 2002,848

data(agaricus.train, package='xgboost') 

    train <- agarics.train 

    X = train$data 
    y = train$label 

    bst <- xgboost(data = train$data, label = train$label, max.depth = 2, 
        eta = 1, nthread = 2, nround = 2,objective = "binary:logistic") 

    xgb.model.dt.tree([email protected][[2]], model = bst) 

    p = rep(0.5,nrow(X)) 

    L = which(X[,'odor=none']==0) 
    R = which(X[,'odor=none']==1) 

    pL = p[L] 
    pR = p[R] 

    yL = y[L] 
    yR = y[R] 

    GL = sum(pL-yL) 
    GR = sum(pR-yR) 
    G = sum(p-y) 

    HL = sum(pL*(1-pL)) 
    HR = sum(pR*(1-pR)) 
    H = sum(p*(1-p)) 

    gain = 0.5 * (GL^2/HL+GR^2/HR-G^2/H) 

    gain 

Ich verstehe, dass Gain gegeben durch die folgende Formel:

gain formula

Da wir log Verlust verwenden, G ist die Summe aus p-y und H ist die Summe von p(1-p) - Gamma und Lambda in diesem Fall sind beide Null.

Kann jemand identifizieren, wo ich falsch liege?

Dank

Antwort

8

OK, ich glaube, ich gearbeitet habe aus. Der Wert für reg_lambda nicht standardmäßig 0 ist, wie in der Dokumentation gegeben, aber tatsächlich 1 (von param.h)

enter image description here

Auch scheint es, dass der Faktor von einem halben nicht angewandt wird, wenn die Berechnung gewinnen, also ist die Spalte Qualität doppelt so hoch wie erwartet. Schließlich ich glaube nicht, dass gamma auch (auch min_split_loss genannt) wird auf diese Berechnung angewandt entweder (von update_hitmaker-inl.hpp)

enter image description here

Stattdessen wird Gamma verwendet, um zu bestimmen, ob Beschneidung berufen, aber wird nicht in der Gewinnberechnung selbst reflektiert, wie die Dokumentation vorschlägt.

enter image description here

Wenn Sie diese Änderungen zu übernehmen, erhalten Sie in der Tat 4.000,53 als Quality für Knoten 0 von 0 Baum, wie in der ursprünglichen Frage. Ich werde das als Problem an die xgboost-Leute richten, damit die Dokumentation entsprechend geändert werden kann.

+0

Mann das hat mich ein bisschen gestört .. Ich werde durcharbeiten, aber ich bin beeindruckt .. Sie sollten sich diese Frage ansehen, da es scheint, als ob Sie xgboost innerhalb von oout lernen. Es war ärger mich für eine Weile..http: //stackoverflow.com/questions/32950607/how-to-access-weighting-of-indiviual-decision-trees-in-xgboost –

+0

Ich konnte sehen, dass der 1/2 Faktor warn ' t angewendet, sollte aber die Standardwerte im Quellcode überprüfen. Gute Arbeit! –

+0

Froh, geholfen zu haben! Es ist ein phänomenaler Algorithmus, der aus den ersten Prinzipien so gut zu verstehen ist. – dataShrimp

Verwandte Themen