2015-11-11 11 views
10

Qualcuno potrebbe spiegare come la colonna Quality nel pacchetto xgboost R viene calcolata nella funzione xgb.model.dt.tree?Come viene calcolata la qualità xgboost?

Nella documentazione si dice che Quality "è il guadagno relativo alla divisione in questo nodo specifico".

Quando si esegue il codice seguente, data nella documentazione xgboost per questa funzione, Quality per il nodo 0 di albero 0 è 4000,53, eppure io calcolare il Gain come 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 

Capisco che Gain è dato dalla seguente formula:

gain formula

dal momento che stiamo usando la perdita di registro, G è la somma di p-y e H è la somma di p(1-p) - gamma e lambda in questo caso sono entrambi zero.

Qualcuno può identificare dove sto andando male?

Grazie

risposta

8

OK, penso di aver risolto il problema. Il valore per reg_lambda non è 0 per default come indicato nella documentazione, ma è in realtà 1 (da param.h)

enter image description here

Inoltre, sembra che il fattore di mezzo non viene applicata nel calcolo del guadagno, quindi la colonna Qualità è il doppio di quanto ci si aspetterebbe. Infine, anche non credo gamma (chiamato anche min_split_loss) viene applicata a questo calcolo sia (da update_hitmaker-inl.hpp)

enter image description here

Invece, gamma viene utilizzato per determinare se ricorrere potatura, ma non si riflette nel calcolo del guadagno stesso, come suggerisce la documentazione.

enter image description here

Se si applicano le modifiche, non effettivamente ottiene 4.000,53 come Quality per il nodo 0 di albero 0, come nella domanda iniziale. Lo solleverò come un problema per gli xgboost, quindi la documentazione può essere modificata di conseguenza.

+0

uomo questo mi ha infastidito un po '.. ci sto lavorando ma sono impressionato .. dovresti dare un'occhiata a questa domanda dato che sembra che tu stia imparando xgboost dentro oout .. è stato mi infastidisce per un po 'di tempo..http: //stackoverflow.com/questions/32950607/how-to-access-weighting-of-indiveual-decision-trees-in-xgboost –

+0

Ho potuto vedere che il fattore 1/2 wasn' t applicato ma dovrebbe essere visto i valori predefiniti nel codice sorgente. Bel lavoro! –

+0

Felice di aver aiutato! È un algoritmo fenomenale, quindi vale la pena comprenderlo dai primi principi. – dataShrimp

Problemi correlati