私はワンステップのインクリメンタル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オブジェクトの増分更新を行うことからの私の期待が何であるかを明確にしたいと思います
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)。
提供された再現例の空のRegTree::FVec.data
ベクトルまで問題を追跡することができました。 booster_.update
への2回目の呼び出しの(手動)トレースは次のとおりです。
this->UpdateOneIter(...);
this->PredictRaw(train, &preds_);
gbm_->Predict(data, out_preds, ntree_limit=0);
PredLoopInternal<GBTree>(p_fmat, out_preds, 0, ntree_limit, true);
PredValue(inst, gid, info.GetRoot(ridx), &feats, tree_begin, tree_end);
int tid = trees[i]->GetLeafIndex(*p_feats, root_index);
ここで失敗します:
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
引数に明示的に設定されていません。
最も参考になるコメント
私は問題の根本が何であるかを知りました。 呼び出して空のブースターを作成することがわかりました
GBTreeブースターを部分的にのみ初期化します。 特に、重要なパラメータ
num_feature
デフォルトでは0に設定
.update()
呼び出しによって適切な数の機能に更新されません。ただし、
num_feature
明示的な値を渡すと、セグメンテーション違反が解決されます。cache=()
が空の場合、またはxgboost.Booster()
は警告を発行する必要があると思います。'num_feature'
は、params
引数に明示的に設定されていません。