Xgboost: рдЕрдЬрдЧрд░ рдХреЗ xgboost.Booster рдХрд╛ рдПрдХ рдЪрд░рдг рдЕрджреНрдпрддрди рдПрдХ segfault рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдорд╛рд░реНрдЪ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dmlc/xgboost

рдореИрдВ рдПрдХ-рдЪрд░рдг рд╡реГрджреНрдзрд┐рд╢реАрд▓ XGBoost рдкрд╣рдирд╛рд╡рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЬрдм рдмреВрд╕реНрдЯрд░ xgboost.train рдлрд╝рдВрдХреНрд╢рди ( рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рдореИрдВ рдмреВрд╕реНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдмреВрд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рддрд░рд╣ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
`` `рдкрд╛рдпрдерди
рдмреВрд╕реНрдЯрд░_ = xgboost.Booster({'рдЙрджреНрджреЗрд╢реНрдп': 'reg:linear'})
рдмреВрд╕реНрдЯрд░_.рдЕрдкрдбреЗрдЯ (рдбреАрдЯреНрд░реЗрди, 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)

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред рдореИрдВ рдЕрдЬрдЧрд░ 2.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()})

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ xgboost.Booster() рдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдпрд╛ рддреЛ cache=() рдЦрд╛рд▓реА рд╣реИ, рдпрд╛
'num_feature' рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ params рддрд░реНрдХ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рдЦрд╛рд▓реА рдмреВрд╕реНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдХреНрдпрд╛ рд╣реИ

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

рд╕рд╛рдорд╛рдиреНрдп рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдмреВрд╕реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ DMatrix dtrain рд╕рд╛рде рдПрдХ рдирдореВрдирд╛ (X, y) рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж

booster_.update(dtrain, 1)

рдЦрд╛рд▓реА рдмреВрд╕реНрдЯрд░ рдпрд╛ рддреЛ f_0(x) рдмрди рдЬрд╛рдПрдЧрд╛ - рдирд┐рд░рдВрддрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА, рдпрд╛ f_1(x) - рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдмреВрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдПрдХ рдЪрд░рдг рдХреЗ рдмрд╛рдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ( рд╣рд╛рд╕реНрдЯреА, рддрд┐рдмреНрд╢реАрд░рд╛рдиреА, тАЛтАЛрдлреНрд░реАрдбрдореИрди рд╕реЗ; 2013 рдХрд╛ 10рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рдкреГрд╖реНрда 361)ред

screen shot 2017-03-21 at 18 07 07

рдореИрдВ рдПрдЪрдЯреАрдИ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреБрдирд░реБрддреНрдкрд╛рджрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА RegTree::FVec.data рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред booster_.update рдкрд░ рджреВрд╕рд░реА рдХреЙрд▓ рдХрд╛ (рдореИрдиреБрдЕрд▓) рдЯреНрд░реЗрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдпрд╣рд╛рдБ рд╡рд┐рдлрд▓:
рд╢рд╛рдорд┐рд▓/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()})

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ xgboost.Booster() рдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдпрд╛ рддреЛ cache=() рдЦрд╛рд▓реА рд╣реИ, рдпрд╛
'num_feature' рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ params рддрд░реНрдХ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

XiaoxiaoWang87 picture XiaoxiaoWang87  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

colinsongf picture colinsongf  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

matthewmav picture matthewmav  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yananchen1989 picture yananchen1989  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

trivialfis picture trivialfis  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ