2016-12-02 7 views
1

私はPythonで訓練されたXGBoostバイナリクラシファイアモデルを持っています。XGBoostライブラリなしでXGBoost出力を生成する方法は?

純粋な数学演算を使用し、XGBoostライブラリ(.predict)を使用せずに、別のスクリプト環境(MQL4)で新しい入力データ用の出力を作成したいと考えています。

誰でも式やアルゴリズムを手助けできますか?

+0

勇敢なアイデア。はい、** 'xgboost' **は最近人気が高まっている「セクシー」タグ付きエンジンです。だから**あなたはこれまでに何を試しました**そして**あなたのモデル統合はどのようにMQL4で動作しましたか?**あなたは既にMQL4がスクリプト環境ではなく**動的にリンクされたライブラリに依存するコード実行。 – user3666197

+0

MQL4で動作するANNモデルがあり、まだXGBoostを統合できませんでした。私はANNといくつかの専門知識を持っていますが、XGBoostではそれほど優れていません。私はこれが4つの算術演算と、すべてのプラットフォームが持ついくつかの追加の数学関数を使って行うことができると信じています。 –

+0

Pythonのxgboost-native環境から 'aTrainedXgbMODEL'をMQL4コードに移植する際に、モデルの実行について疑問はありません(MQL4側で' aClassXgbGUESS = aTrainedXgbMODEL.predict(aFeatureVEC);の形式) (オンライン学習機能拡張を実行しているモデルの必要性については言及していません)。したがって、プロダクショングレードのシステムは、「4つの算術演算」または「数式および/またはアルゴリズム」の観点からではなく、分散アーキテクチャの観点からは非常に要求されます。 – user3666197

答えて

2

いくつかのリバースエンジニアリングの後、モデルが訓練されてから最初のテキストファイルにあなたのモデルをダンプ:

num_round = 3 
bst = xgb.train(param, dtrain, num_round, watchlist)  
bst.dump_model('D:/Python/classifyproduct.raw.txt') 

次に、各ブースターの入力機能セットのための葉の確率を見つけます。すべてのこれらの確率を合計し、我々の場合には、バイナリロジスティック関数に送り込ま:

1/(1+exp(-sum)) 

これは、与えられた入力機能セットのためのxgboost訓練されたモデルの出力確率です。たとえば、2つの入力(aとb)のテキストファイルを含むサンプルダンプは、

booster[0]: 
0:[b<-1] yes=1,no=2,missing=1 
1:[a<0] yes=3,no=4,missing=3 
    3:[a<-2] yes=7,no=8,missing=7 
     7:leaf=0.522581 
     8:[b<-3] yes=13,no=14,missing=13 
      13:leaf=0.428571 
      14:leaf=-0.333333 
    4:leaf=-0.54 
2:[a<2] yes=5,no=6,missing=5 
    5:[a<-8] yes=9,no=10,missing=9 
     9:leaf=-0.12 
     10:leaf=-0.56129 
    6:[b<2] yes=11,no=12,missing=11 
     11:leaf=-0.495652 
     12:[a<4] yes=15,no=16,missing=15 
      15:[b<7] yes=17,no=18,missing=17 
       17:leaf=-0.333333 
       18:leaf=0.333333 
      16:leaf=0.456 
booster[1]: 
0:[b<-1] yes=1,no=2,missing=1 
1:[a<0] yes=3,no=4,missing=3 
    3:[b<-3] yes=7,no=8,missing=7 
     7:leaf=0.418665 
     8:[a<-3] yes=13,no=14,missing=13 
      13:leaf=0.334676 
      14:leaf=-0.282568 
    4:leaf=-0.424174 
2:[a<2] yes=5,no=6,missing=5 
    5:[b<0] yes=9,no=10,missing=9 
     9:leaf=-0.048659 
     10:leaf=-0.445149 
    6:[b<2] yes=11,no=12,missing=11 
     11:leaf=-0.394495 
     12:[a<5] yes=15,no=16,missing=15 
      15:[b<7] yes=17,no=18,missing=17 
       17:leaf=-0.330064 
       18:leaf=0.333063 
      16:leaf=0.392826 
booster[2]: 
0:[b<-1] yes=1,no=2,missing=1 
1:[a<0] yes=3,no=4,missing=3 
    3:[b<-3] yes=7,no=8,missing=7 
     7:leaf=0.356906 
     8:[a<-3] yes=13,no=14,missing=13 
      13:leaf=0.289085 
      14:leaf=-0.245992 
    4:leaf=-0.363819 
2:[a<4] yes=5,no=6,missing=5 
    5:[a<2] yes=9,no=10,missing=9 
     9:[b<0] yes=15,no=16,missing=15 
      15:leaf=-0.0403689 
      16:leaf=-0.381402 
     10:[b<7] yes=17,no=18,missing=17 
      17:leaf=-0.307704 
      18:leaf=0.239974 
    6:[b<2] yes=11,no=12,missing=11 
     11:leaf=-0.308265 
     12:leaf=0.302142 

です。入力として2つの機能があります。入力として[4,9]があるとしましょう。ブースター確率は次のように計算できます。

booster0 : 0.456 
booster1 : 0.333063 
booster2 : 0.302142 
sum = 1.091205 
1/(1+exp(-sum)) = 0.748608563 

これだけです。

+0

データ構造を取得する方法はありますか? sklearn GBDTのように?例えば、 – dksahuji

+0

。 clf.estimators_ [idx] [0] .tree_はあなたが通過できる木です。 – dksahuji

+0

bst.get_dump(dump_format = 'json') これは私が探していたものです。うまくいけば、誰かがこれが有用であると考えます – dksahuji

関連する問題