2015-11-11 14 views
10

xgboost RパッケージのQuality列がxgb.model.dt.tree関数でどのように計算されるのか誰かが説明できますか?xgboostの品質はどのように計算されますか?

ドキュメントでは、Qualityは「この特定のノードの分割に関連する利益です」と記載しています。あなたはこの関数のxgboostのマニュアルの次のコードを実行すると、

、ツリー0のノード0のためのQualityは4000.53で、まだ私は計算し、私はGainが与えられていることを理解Gain

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 

2002.848として我々は、ログ損失を使用しているので

gain formula

、Gはp-yの和であり、Hは、合計である:以下の式でp(1-p) - この場合、ガンマとラムダは両方ともゼロです。

どこに間違っているのか誰でも確認できますか?

ありがとうございました

答えて

8

OK、私はそれを取り組んだと思います。 reg_lambdaの値は、ドキュメントに与えられるように、デフォルトで0ではないが、実際には1(param.hから)である

enter image description here

また、計算時半分の要因が適用されないと思われますゲインの値が表示されます。最後に、私もgamma(もmin_split_loss呼ばれる)は(update_hitmaker-inl.hppから)この計算のいずれかに適用されるとは思わない

enter image description here

代わりに、ガンマは剪定を起動するかどうかを決定するために使用されていますが、ドキュメントが示唆するように、ゲイン計算自体には反映されません。

enter image description here

あなたはこれらの変更を適用した場合、あなたは確かに元の質問のように、ツリー0のノード0のためのQualityとして4000.53を得るのですか。私はxgboostの人にこれを問題として提起するので、ドキュメントはそれに応じて変更することができます。

+0

男これは私に少し迷惑をかけてきました。私はそれを通って作業するつもりですが、私は感心しています。あなたはooutの中でxgboostを学んでいるようですので、この質問を見てください。私はしばらく私を困らせていた.http://stackoverflow.com/questions/32950607/how-to-access-weighting-of-indiviual-decision-trees-in-xgboost –

+0

私は、適用されるが、ソースコードのデフォルトを調べるべきである。よくやった! –

+0

助けてくれてうれしい!それは驚異的なアルゴリズムなので、最初の原則から十分理解できる価値があります。 – dataShrimp

関連する問題