2015-10-05 3 views
12

私が学んだ決定木の加重和を計算することにより、勾配後押し作品を理解として、私はxgboostで個別の意思決定木の重み付けにアクセスするには?

param = {'objective':'rank:pairwise', 'booster':'gbtree'} 

でランク付けするxgboostを使用しています。学習した各ブースターに割り当てられているウェイトにはどのようにアクセスできますか?私は予測ステップをスピードアップするためにトレーニングの後にウエイトを後処理しようとしましたが、個々のウエイトを取得する方法はわかりません。 dump_model()を使用すると、作成されたファイルにさまざまな決定木が表示されますが、重み付けはそこに保存されません。 APIでは適切な関数が見つかりませんでした。または、収縮パラメータetaを使用して手動で重量を計算することはできますか?

+0

この質問の回答が大好きです...良い質問! –

答えて

16

各ツリーには同じ重みが与えられています。etaと全体的な予測は、それぞれのツリーの予測の合計です。

以前のツリーには後者のツリーよりも大きな重みが与えられますが、それは必ずしも必要ではありません。すべてのツリーの後に応答が更新されるためです。ここでおもちゃの例です:

は、我々は最初のツリーが構築され、12、18、27、39、54

の予測を提供している5つの応答10との観測、20、30、40、50を持っていると仮定今、eta = 1の場合、次のツリーに渡される応答変数は、-2,2,3,1,4(予測と真の応答の差)になります。次のツリーは、最初のツリーでは捕捉されなかった「ノイズ」を学習しようとします。 nrounds = 2の場合、2つのツリーからの予測の合計がモデルの最終予測を行います。

代わりにeta = 0.1の場合、すべてのツリーの予測値はetaでスケールダウンされるため、最初のツリーは代わりに1.2,1.8,2.7,3.9,9.4を予測します。次に、次のツリーに渡される応答変数は、8.8,18.2,27.3,36.1,44.6(スケーリングされた予測と真の応答との間の差)の値を有する.2番目のラウンドは、これらの応答値を使用して別のツリーを構築し、 etaによってスケーリングされます。だから、木2は、7,18,25,40,40のように、一度スケーリングされると、0.7,1.8,2.5,4.0,4.0となると予測します。前述のように、3番目のツリーには、これらの値と前のツリーのレスポンス変数の差が渡されます(8.1,16.4,24.8,32.1,40.6)。再び、すべての木からの予測の合計が最終的な予測を与える。

明らかにeta = 0.1の場合、base_scoreが0の場合は、予測可能な場所に近い場所に予測が必要です。一般に、1/etaラウンドの絶対最小値が必要であり、通常はそれ以上の値が必要です。

小さいetaを使用することの理論的根拠は、ツリー1を作成するのではなく予測に向けて小さなステップを取ることによるメリットがメリットであることです。それは結晶化のようなものです。ゆっくりと冷やすと、より大きく、より良い結晶が得られます。欠点は、nroundsを増やす必要があるため、アルゴリズムの実行時間を増加させることです。

+0

良い答えですが、この質問は実際にはより一般的な質問です。残差にちょうど合うので、それぞれのツリーの予測を 'eta'でスケーリングしたものを足しただけです。これは受け入れられるべきです。 –

+0

@dataShrimp、こんにちは、多分あなたは[この質問](http://stackoverflow.com/questions/35983565/how-is-the-parameter-weight-dmatrix-used-in-the-gradient-boosting-procedure)に答えることができます)? – Ojtwist

+0

これは私が出会った最も明白な説明の一つです。ありがとう! – santon

関連する問題