やあ、
XGBoostモデルをWekaモデルに変換する方法はありますか?
推論時のxgboostモデルの効率に奇妙な問題があります。
ラウンド/ツリーの数を1に設定し、ツリーの深さを108に設定し、マルチクラス分類の問題にjvm-packageを使用しています。
DMatrixの作成や推論/予測を含め、インスタンスを1つずつ作成するときにXGBoostツリーを使用して6000インスタンスを予測するには、380ミリ秒かかります。
(DMatrixの作成を除くと180msかかります)。
// creating a DMatrix with one row and the numberOfFeatures
// columns
double startTime = System.nanoTime();
DMatrix testInstance = new DMatrix(testingInstance, 1, numberOfFeatures, 9999F);
// predict just one instance
float[][] predicts = booster.predict(testInstance);
predictionTime += (System.nanoTime() - startTime) / 1e6;
ただし、Wekaランダムフォレストを使用してそれらを予測/推論すると、30ミリ秒しかかかりません。
ラウンド数(ツリー)= 50の場合、WEKAランダムフォレストは922ミリ秒で6000インスタンスを予測し、XGBoostツリーは3429ミリ秒でそれらを予測します。
問題は、XGBoostツリーの精度がランダムフォレストよりもはるかに優れていることです。 しかし、私の場合、推論時間も非常に重要です。
それで、XGBoostモデルをWEKAモデルに変換する方法はありますか?!
それとも、私が予測をより速くする方法を知っていますか?! Javaソースコードからネイティブライブラリを呼び出すため、効率の問題はありますか?
ありがとう。
https://github.com/komiya-atsushi/xgboost-predictor-java
これは役立つかもしれません
https://github.com/komiya-atsushi/xgboost-predictor-javaのベンチマークテーブルから:純粋なJava予測は最大4桁高速です! xgboost Javaインターフェイスのどこかにひどく非効率的なものがあるはずです...ある時点でJavaベースのスコアリングの使用を検討していますが、そのために別のオフショットプロジェクトに依存したくありません。
これは主に、現在のインターフェイスが(インスタンスごとの)オンラインスコアリング用に設計されておらず、バッチスコアリング用に設計されているためです。 DMatrixを作成するオーバーヘッドは、オンラインスコアリングを引き継ぎます。 その場合、専用のオンラインスコアリングインターフェイスが必要です。
最も参考になるコメント
これは主に、現在のインターフェイスが(インスタンスごとの)オンラインスコアリング用に設計されておらず、バッチスコアリング用に設計されているためです。 DMatrixを作成するオーバーヘッドは、オンラインスコアリングを引き継ぎます。 その場合、専用のオンラインスコアリングインターフェイスが必要です。