Xgboost: Pythonのxgboost.Boosterのワンステップアップデートがセグメンテーション違反で失敗する

作成日 2017年03月22日  ·  3コメント  ·  ソース: dmlc/xgboost

私はワンステップのインクリメンタルXGBoostアンサンブル構築を実験していました。 Boosterがxgboost.train関数( pythonライブラリ)によって作成されると、すべてが正常に機能しているように見えます。
ただし、ブースターを作成し、次のように次のようになります。
`` `python
booster_ = xgboost.Booster({'objective': 'reg:linear'})
booster_.update(dtrain、1)

the python process fails with a segmentation fault.

## Environment info
Operating System:
* **python 3.6** Mac OS X 10.10.5 (Darwin 14.5.0), Ubuntu 14.04.5 LTS (GNU/Linux 3.19.0-25-generic x86_64);
* **python 2.7** Mac OS X 10.10.6 (Darwin 15.6.0);

Compiler:
* **python 3.6** used `pip install xgboost`;
* **python 2.7** gcc (6.3.0 --without-multilib);

`xgboost` version used:
* **python 3.6** version 0.6 from pip;
* **python 2.7.13** git HEAD 4a63f4ab43480adaaf13bde2485d5bfedd952520;

## Steps to reproduce
```python
import xgboost
dtrain = xgboost.DMatrix(data=[[-1.0], [0.0], [1.0]], label=[0.0, -1.0, 1.0])

booster_ = xgboost.Booster({'objective': 'reg:linear', 'max_depth': 1})
booster_.update(dtrain, 1)

booster_.update(dtrain, 1)

最後の行はセグメンテーション違反を引き起こします。 Python2.7.13のクラッシュレポートを添付し

最も参考になるコメント

私は問題の根本が何であるかを知りました。 呼び出して空のブースターを作成することがわかりました

booster_ = xgboost.Booster({'objective': 'reg:linear'})

GBTreeブースターを部分的にのみ初期化します。 特に、重要なパラメータnum_feature
デフォルトでは0に設定.update()呼び出しによって適切な数の機能に更新されません

ただし、 num_feature明示的な値を渡すと、セグメンテーション違反が解決されます。

booster_ = xgboost.Booster({'objective': 'reg:linear', 'num_feature': dtrain.num_col()})

cache=()が空の場合、またはxgboost.Booster()は警告を発行する必要があると思います。
'num_feature'は、 params引数に明示的に設定されていません。

全てのコメント3件

によって返された空のBoosterオブジェクトの増分更新を行うことからの私の期待が何であるかを明確にしたいと思います

booster_ = xgboost.Booster({'objective': 'reg:linear', 'max_depth': 1})

一般的な勾配ブースティングアルゴリズムによると、DMatrix dtrainサンプル(X、y)を更新した後、

booster_.update(dtrain, 1)

空のブースターは、以下に示すように、 f_0(x) -一定の予測、またはf_1(x) -勾配ブースティングの1ステップ後の予測になります( Hastie、Tibshirani、Friedman、2013年第10版のページから) 361)。

screen shot 2017-03-21 at 18 07 07

提供された再現例の空のRegTree::FVec.dataベクトルまで問題を追跡することができました。 booster_.updateへの2回目の呼び出しの(手動)トレースは次のとおりです。

ここで失敗します:
include / xgboost / tree_model.h:#L528
..., feat.fvalue(split_index), feat.is_missing(split_index), ...

feat.data.size() == 0です。 .update()への最初の呼び出しの後、このベクトルがまだ空であるのに、 .train()への代替呼び出しの後は空ではない理由はわかりません。

私は問題の根本が何であるかを知りました。 呼び出して空のブースターを作成することがわかりました

booster_ = xgboost.Booster({'objective': 'reg:linear'})

GBTreeブースターを部分的にのみ初期化します。 特に、重要なパラメータnum_feature
デフォルトでは0に設定.update()呼び出しによって適切な数の機能に更新されません

ただし、 num_feature明示的な値を渡すと、セグメンテーション違反が解決されます。

booster_ = xgboost.Booster({'objective': 'reg:linear', 'num_feature': dtrain.num_col()})

cache=()が空の場合、またはxgboost.Booster()は警告を発行する必要があると思います。
'num_feature'は、 params引数に明示的に設定されていません。

このページは役に立ちましたか?
0 / 5 - 0 評価