xgboost
tree_model.h
Go to the documentation of this file.
1 
7 #ifndef XGBOOST_TREE_MODEL_H_
8 #define XGBOOST_TREE_MODEL_H_
9 
10 #include <xgboost/base.h>
11 #include <xgboost/data.h>
12 #include <xgboost/feature_map.h>
13 #include <xgboost/host_device_vector.h> // for HostDeviceVector
14 #include <xgboost/linalg.h> // for VectorView
15 #include <xgboost/logging.h>
16 #include <xgboost/model.h>
17 #include <xgboost/multi_target_tree_model.h> // for MultiTargetTree
18 
19 #include <algorithm>
20 #include <cstring>
21 #include <limits> // for numeric_limits
22 #include <memory> // for unique_ptr
23 #include <string>
24 #include <type_traits> // for is_signed_v
25 #include <vector>
26 
27 namespace xgboost {
28 
29 namespace tree {
30 struct ScalarTreeView;
31 struct MultiTargetTreeView;
32 }
33 
34 class Json;
35 
37 struct TreeParam {
46 
47  bool operator==(const TreeParam& b) const {
48  return num_nodes == b.num_nodes && num_deleted == b.num_deleted &&
50  }
51 
52  void FromJson(Json const& in);
53  void ToJson(Json* p_out) const;
54 };
55 
57 struct RTreeNodeStat {
59  float loss_chg;
61  float sum_hess;
63  float base_weight;
66 
67  RTreeNodeStat() = default;
68  RTreeNodeStat(float loss_chg, float sum_hess, float weight)
70  bool operator==(const RTreeNodeStat& b) const {
71  return loss_chg == b.loss_chg && sum_hess == b.sum_hess && base_weight == b.base_weight &&
73  }
74 };
75 
81 class RegTree : public Model {
82  public:
83  using SplitCondT = float;
85  static constexpr uint32_t kDeletedNodeMarker = std::numeric_limits<uint32_t>::max();
86  static constexpr bst_node_t kRoot{0};
87 
89  class Node {
90  public:
92  // assert compact alignment
93  static_assert(sizeof(Node) == 4 * sizeof(int) + sizeof(Info), "Node: 64 bit align");
94  }
95  Node(int32_t cleft, int32_t cright, int32_t parent, uint32_t split_ind, float split_cond,
96  bool default_left)
97  : parent_{parent}, cleft_{cleft}, cright_{cright} {
98  this->SetParent(parent_);
99  this->SetSplit(split_ind, split_cond, default_left);
100  }
101 
103  [[nodiscard]] XGBOOST_DEVICE int LeftChild() const { return this->cleft_; }
105  [[nodiscard]] XGBOOST_DEVICE int RightChild() const { return this->cright_; }
107  [[nodiscard]] XGBOOST_DEVICE int DefaultChild() const {
108  return this->DefaultLeft() ? this->LeftChild() : this->RightChild();
109  }
111  [[nodiscard]] XGBOOST_DEVICE bst_feature_t SplitIndex() const {
112  static_assert(!std::is_signed_v<bst_feature_t>);
113  return sindex_ & ((1U << 31) - 1U);
114  }
116  [[nodiscard]] XGBOOST_DEVICE bool DefaultLeft() const { return (sindex_ >> 31) != 0; }
118  [[nodiscard]] XGBOOST_DEVICE bool IsLeaf() const { return cleft_ == kInvalidNodeId; }
120  [[nodiscard]] XGBOOST_DEVICE float LeafValue() const { return (this->info_).leaf_value; }
122  [[nodiscard]] XGBOOST_DEVICE SplitCondT SplitCond() const { return (this->info_).split_cond; }
124  [[nodiscard]] XGBOOST_DEVICE int Parent() const { return parent_ & ((1U << 31) - 1); }
126  [[nodiscard]] XGBOOST_DEVICE bool IsLeftChild() const { return (parent_ & (1U << 31)) != 0; }
128  [[nodiscard]] XGBOOST_DEVICE bool IsDeleted() const { return sindex_ == kDeletedNodeMarker; }
130  [[nodiscard]] XGBOOST_DEVICE bool IsRoot() const { return parent_ == kInvalidNodeId; }
135  XGBOOST_DEVICE void SetLeftChild(int nid) {
136  this->cleft_ = nid;
137  }
143  this->cright_ = nid;
144  }
151  XGBOOST_DEVICE void SetSplit(unsigned split_index, SplitCondT split_cond,
152  bool default_left = false) {
153  if (default_left) split_index |= (1U << 31);
154  this->sindex_ = split_index;
155  (this->info_).split_cond = split_cond;
156  }
163  XGBOOST_DEVICE void SetLeaf(bst_float value, int right = kInvalidNodeId) {
164  (this->info_).leaf_value = value;
165  this->cleft_ = kInvalidNodeId;
166  this->cright_ = right;
167  }
170  this->sindex_ = kDeletedNodeMarker;
171  }
174  this->sindex_ = 0;
175  }
176  // set parent
177  XGBOOST_DEVICE void SetParent(int pidx, bool is_left_child = true) {
178  if (is_left_child) pidx |= (1U << 31);
179  this->parent_ = pidx;
180  }
181  bool operator==(const Node& b) const {
182  return parent_ == b.parent_ && cleft_ == b.cleft_ &&
183  cright_ == b.cright_ && sindex_ == b.sindex_ &&
184  info_.leaf_value == b.info_.leaf_value;
185  }
186 
187  private:
192  union Info{
193  bst_float leaf_value;
194  SplitCondT split_cond;
195  };
196  // pointer to parent, highest bit is used to
197  // indicate whether it's a left child or not
198  int32_t parent_{kInvalidNodeId};
199  // pointer to left, right
200  int32_t cleft_{kInvalidNodeId}, cright_{kInvalidNodeId};
201  // split feature index, left split or right split depends on the highest bit
202  uint32_t sindex_{0};
203  // extra info
204  Info info_;
205  };
206 
213  void ChangeToLeaf(bst_node_t nidx, float value) {
214  auto& h_nodes = nodes_.HostVector();
215  CHECK(h_nodes[h_nodes[nidx].LeftChild()].IsLeaf());
216  CHECK(h_nodes[h_nodes[nidx].RightChild()].IsLeaf());
217  this->DeleteNode(h_nodes[nidx].LeftChild());
218  this->DeleteNode(h_nodes[nidx].RightChild());
219  h_nodes[nidx].SetLeaf(value);
220  }
227  void CollapseToLeaf(bst_node_t nidx, float value) {
228  auto& h_nodes = nodes_.HostVector();
229  if (h_nodes[nidx].IsLeaf()) return;
230  if (!h_nodes[h_nodes[nidx].LeftChild()].IsLeaf()) {
231  CollapseToLeaf(h_nodes[nidx].LeftChild(), 0.0f);
232  }
233  if (!h_nodes[h_nodes[nidx].RightChild()].IsLeaf()) {
234  CollapseToLeaf(h_nodes[nidx].RightChild(), 0.0f);
235  }
236  this->ChangeToLeaf(nidx, value);
237  }
238 
240  nodes_.HostVector().resize(param_.num_nodes);
241  stats_.HostVector().resize(param_.num_nodes);
242  split_types_.HostVector().resize(param_.num_nodes, FeatureType::kNumerical);
243  split_categories_segments_.HostVector().resize(param_.num_nodes);
244  auto& h_nodes = nodes_.HostVector();
245  for (int i = 0; i < param_.num_nodes; i++) {
246  h_nodes[i].SetLeaf(0.0f);
247  h_nodes[i].SetParent(kInvalidNodeId);
248  }
249  }
253  explicit RegTree(bst_target_t n_targets, bst_feature_t n_features) : RegTree{} {
254  param_.num_feature = n_features;
255  param_.size_leaf_vector = n_targets;
256  if (n_targets > 1) {
257  this->p_mt_tree_.reset(new MultiTargetTree{&param_});
258  }
259  }
260 
262  Node& operator[](bst_node_t nidx) { return nodes_.HostVector()[nidx]; }
263 
264  public:
266  [[nodiscard]] common::Span<Node const> GetNodes(DeviceOrd device) const {
267  CHECK(!this->IsMultiTarget());
268  return device.IsCPU() ? nodes_.ConstHostSpan()
269  : (nodes_.SetDevice(device), nodes_.ConstDeviceSpan());
270  }
271 
274  CHECK(!this->IsMultiTarget());
275  return device.IsCPU() ? stats_.ConstHostSpan()
276  : (stats_.SetDevice(device), stats_.ConstDeviceSpan());
277  }
278 
280  RTreeNodeStat& Stat(int nid) {
281  return stats_.HostVector()[nid];
282  }
283 
284  void LoadModel(Json const& in) override;
285  void SaveModel(Json* out) const override;
286 
287  bool operator==(const RegTree& b) const {
288  return nodes_.ConstHostVector() == b.nodes_.ConstHostVector() &&
289  stats_.ConstHostVector() == b.stats_.ConstHostVector() &&
290  deleted_nodes_ == b.deleted_nodes_ && param_ == b.param_;
291  }
298  [[nodiscard]] bool Equal(const RegTree& b) const;
299 
317  void ExpandNode(bst_node_t nid, unsigned split_index, bst_float split_value,
318  bool default_left, bst_float base_weight,
319  bst_float left_leaf_weight, bst_float right_leaf_weight,
320  bst_float loss_change, float sum_hess, float left_sum,
321  float right_sum,
322  bst_node_t leaf_right_child = kInvalidNodeId);
331  void ExpandNode(bst_node_t nidx, bst_feature_t split_index, float split_cond, bool default_left,
334  linalg::VectorView<float const> right_weight, float loss_chg, float sum_hess,
335  float left_sum, float right_sum);
346  void SetLeaves(std::vector<bst_node_t> leaves, common::Span<float const> weights);
347 
364  common::Span<const uint32_t> split_cat, bool default_left,
365  bst_float base_weight, bst_float left_leaf_weight,
366  bst_float right_leaf_weight, bst_float loss_change, float sum_hess,
367  float left_sum, float right_sum);
371  [[nodiscard]] bool HasCategoricalSplit() const { return !split_categories_.Empty(); }
375  [[nodiscard]] bool IsMultiTarget() const { return static_cast<bool>(p_mt_tree_); }
379  [[nodiscard]] bst_target_t NumTargets() const { return param_.size_leaf_vector; }
383  [[nodiscard]] auto GetMultiTargetTree() const {
384  CHECK(IsMultiTarget());
385  return p_mt_tree_.get();
386  }
390  [[nodiscard]] bst_feature_t NumFeatures() const noexcept { return param_.num_feature; }
394  [[nodiscard]] bst_node_t NumNodes() const noexcept { return param_.num_nodes; }
398  [[nodiscard]] bst_node_t NumValidNodes() const noexcept {
399  return param_.num_nodes - param_.num_deleted;
400  }
404  [[nodiscard]] bst_node_t NumExtraNodes() const noexcept {
405  return param_.num_nodes - 1 - param_.num_deleted;
406  }
407  /* \brief Count number of leaves in tree. */
408  [[nodiscard]] bst_node_t GetNumLeaves() const;
409  [[nodiscard]] bst_node_t GetNumSplitNodes() const;
410 
414  [[nodiscard]] bst_node_t GetDepth(bst_node_t nidx) const;
421  void SetRoot(linalg::VectorView<float const> weight, float sum_hess) {
422  CHECK(IsMultiTarget());
423  return this->p_mt_tree_->SetRoot(weight, sum_hess);
424  }
428  [[nodiscard]] bst_node_t MaxDepth() const;
429 
434  struct FVec {
439  void Init(size_t size);
444  void Fill(SparsePage::Inst const& inst);
445 
450  void Drop();
455  [[nodiscard]] size_t Size() const;
461  [[nodiscard]] bst_float GetFvalue(size_t i) const;
467  [[nodiscard]] bool IsMissing(size_t i) const;
468  [[nodiscard]] bool HasMissing() const;
469  void HasMissing(bool has_missing) { this->has_missing_ = has_missing; }
470 
471  [[nodiscard]] common::Span<float> Data() { return data_; }
472 
473  private:
479  std::vector<float> data_;
480  bool has_missing_;
481  };
482 
490  [[nodiscard]] std::string DumpModel(const FeatureMap& fmap, bool with_stats,
491  std::string format) const;
496  return device.IsCPU() ? split_types_.ConstHostSpan()
497  : (split_types_.SetDevice(device), split_types_.ConstDeviceSpan());
498  }
500  return device.IsCPU()
501  ? split_categories_.ConstHostSpan()
502  : (split_categories_.SetDevice(device), split_categories_.ConstDeviceSpan());
503  }
504  [[nodiscard]] auto const& GetSplitCategoriesPtr() const {
505  return split_categories_segments_.ConstHostVector();
506  }
507 
516  struct Segment {
517  std::size_t beg{0};
518  std::size_t size{0};
519  };
523  };
524 
527  view.split_type = this->GetSplitTypes(device);
528  view.categories = this->GetSplitCategories(device);
529  if (device.IsCPU()) {
530  view.node_ptr = split_categories_segments_.ConstHostSpan();
531  } else {
532  split_categories_segments_.SetDevice(device);
533  view.node_ptr = split_categories_segments_.ConstDeviceSpan();
534  }
535  return view;
536  }
537 
538  [[nodiscard]] bst_node_t LeftChild(bst_node_t nidx) const {
539  if (IsMultiTarget()) {
540  return this->p_mt_tree_->LeftChild(nidx);
541  }
542  return nodes_.ConstHostVector()[nidx].LeftChild();
543  }
544  [[nodiscard]] bst_node_t RightChild(bst_node_t nidx) const {
545  if (IsMultiTarget()) {
546  return this->p_mt_tree_->RightChild(nidx);
547  }
548  return nodes_.ConstHostVector()[nidx].RightChild();
549  }
550  [[nodiscard]] bst_node_t Size() const {
551  if (IsMultiTarget()) {
552  return this->p_mt_tree_->Size();
553  }
554  return this->nodes_.Size();
555  }
556 
557  [[nodiscard]] RegTree* Copy() const;
558  tree::ScalarTreeView HostScView() const;
559  tree::MultiTargetTreeView HostMtView() const;
560 
561  private:
562  template <bool typed>
563  void LoadCategoricalSplit(Json const& in);
564  void SaveCategoricalSplit(Json* p_out) const;
566  TreeParam param_;
567  // vector of nodes
568  HostDeviceVector<Node> nodes_;
569  // free node space, used during training process
570  std::vector<int> deleted_nodes_;
571  // stats of nodes
573  HostDeviceVector<FeatureType> split_types_;
574 
575  // Categories for each internal node.
576  HostDeviceVector<uint32_t> split_categories_;
577  // Ptr to split categories of each node.
578  HostDeviceVector<CategoricalSplitMatrix::Segment> split_categories_segments_;
579  // ptr to multi-target tree with vector leaf.
580  std::unique_ptr<MultiTargetTree> p_mt_tree_;
581  // allocate a new node,
582  // !!!!!! NOTE: may cause BUG here, nodes.resize
583  bst_node_t AllocNode() {
584  if (param_.num_deleted != 0) {
585  int nid = deleted_nodes_.back();
586  deleted_nodes_.pop_back();
587  nodes_.HostVector()[nid].Reuse();
588  --param_.num_deleted;
589  return nid;
590  }
591  int nd = param_.num_nodes++;
592  CHECK_LT(param_.num_nodes, std::numeric_limits<int>::max())
593  << "number of nodes in the tree exceed 2^31";
594  nodes_.HostVector().resize(param_.num_nodes);
595  stats_.HostVector().resize(param_.num_nodes);
596  split_types_.HostVector().resize(param_.num_nodes, FeatureType::kNumerical);
597  split_categories_segments_.HostVector().resize(param_.num_nodes);
598  return nd;
599  }
600  // delete a tree node, keep the parent field to allow trace back
601  void DeleteNode(int nid) {
602  CHECK_GE(nid, 1);
603  auto pid = (*this)[nid].Parent();
604  if (nid == (*this)[pid].LeftChild()) {
605  (*this)[pid].SetLeftChild(kInvalidNodeId);
606  } else {
607  (*this)[pid].SetRightChild(kInvalidNodeId);
608  }
609 
610  deleted_nodes_.push_back(nid);
611  nodes_.HostVector()[nid].MarkDelete();
612  ++param_.num_deleted;
613  }
614 };
615 
616 inline void RegTree::FVec::Init(size_t size) {
617  data_.resize(size);
618  std::fill(data_.begin(), data_.end(), std::numeric_limits<float>::quiet_NaN());
619  has_missing_ = true;
620 }
621 
622 inline void RegTree::FVec::Fill(SparsePage::Inst const& inst) {
623  auto p_data = inst.data();
624  auto p_out = data_.data();
625 
626  for (std::size_t i = 0, n = inst.size(); i < n; ++i) {
627  auto const& entry = p_data[i];
628  p_out[entry.index] = entry.fvalue;
629  }
630  has_missing_ = data_.size() != inst.size();
631 }
632 
633 inline void RegTree::FVec::Drop() { this->Init(this->Size()); }
634 
635 inline size_t RegTree::FVec::Size() const {
636  return data_.size();
637 }
638 
639 inline float RegTree::FVec::GetFvalue(size_t i) const {
640  return data_[i];
641 }
642 
643 inline bool RegTree::FVec::IsMissing(size_t i) const { return std::isnan(data_[i]); }
644 
645 inline bool RegTree::FVec::HasMissing() const { return has_missing_; }
646 
647 // Multi-target tree not yet implemented error
649  return " support for multi-target tree is not yet implemented.";
650 }
651 } // namespace xgboost
652 #endif // XGBOOST_TREE_MODEL_H_
Defines configuration macros and basic types for xgboost.
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:57
Feature map data structure to help text model dump. TODO(tqchen) consider make it even more lightweig...
Definition: feature_map.h:22
Definition: host_device_vector.h:87
bool Empty() const
Definition: host_device_vector.h:102
common::Span< T const > ConstHostSpan() const
Definition: host_device_vector.h:116
std::vector< T > & HostVector()
common::Span< const T > ConstDeviceSpan() const
void SetDevice(DeviceOrd device) const
Data structure representing JSON format.
Definition: json.h:396
Tree structure for multi-target model.
Definition: multi_target_tree_model.h:38
static constexpr bst_node_t InvalidNodeId()
Definition: multi_target_tree_model.h:40
tree node
Definition: tree_model.h:89
XGBOOST_DEVICE int Parent() const
get parent of the node
Definition: tree_model.h:124
XGBOOST_DEVICE void MarkDelete()
mark that this node is deleted
Definition: tree_model.h:169
XGBOOST_DEVICE bool IsRoot() const
whether current node is root
Definition: tree_model.h:130
XGBOOST_DEVICE int RightChild() const
index of right child
Definition: tree_model.h:105
XGBOOST_DEVICE float LeafValue() const
Definition: tree_model.h:120
XGBOOST_DEVICE Node()
Definition: tree_model.h:91
XGBOOST_DEVICE void SetParent(int pidx, bool is_left_child=true)
Definition: tree_model.h:177
XGBOOST_DEVICE void SetLeaf(bst_float value, int right=kInvalidNodeId)
set the leaf value of the node
Definition: tree_model.h:163
XGBOOST_DEVICE bool IsLeftChild() const
whether current node is left child
Definition: tree_model.h:126
XGBOOST_DEVICE void SetSplit(unsigned split_index, SplitCondT split_cond, bool default_left=false)
set split condition of current node
Definition: tree_model.h:151
XGBOOST_DEVICE void SetLeftChild(int nid)
set the left child
Definition: tree_model.h:135
XGBOOST_DEVICE bst_feature_t SplitIndex() const
feature index of split condition
Definition: tree_model.h:111
XGBOOST_DEVICE bool IsDeleted() const
whether this node is deleted
Definition: tree_model.h:128
XGBOOST_DEVICE bool IsLeaf() const
whether current node is leaf node
Definition: tree_model.h:118
bool operator==(const Node &b) const
Definition: tree_model.h:181
Node(int32_t cleft, int32_t cright, int32_t parent, uint32_t split_ind, float split_cond, bool default_left)
Definition: tree_model.h:95
XGBOOST_DEVICE void Reuse()
Reuse this deleted node.
Definition: tree_model.h:173
XGBOOST_DEVICE void SetRightChild(int nid)
set the right child
Definition: tree_model.h:142
XGBOOST_DEVICE bool DefaultLeft() const
when feature is unknown, whether goes to left child
Definition: tree_model.h:116
XGBOOST_DEVICE int LeftChild() const
index of left child
Definition: tree_model.h:103
XGBOOST_DEVICE int DefaultChild() const
index of default child when feature is missing
Definition: tree_model.h:107
XGBOOST_DEVICE SplitCondT SplitCond() const
Definition: tree_model.h:122
define regression tree to be the most common tree model.
Definition: tree_model.h:81
void SaveModel(Json *out) const override
saves the model config to a JSON object
tree::MultiTargetTreeView HostMtView() const
RegTree * Copy() const
void ChangeToLeaf(bst_node_t nidx, float value)
Change a non leaf node to a leaf node, delete its children.
Definition: tree_model.h:213
bst_target_t NumTargets() const
The size of leaf weight.
Definition: tree_model.h:379
bool operator==(const RegTree &b) const
Definition: tree_model.h:287
bst_node_t NumNodes() const noexcept
Get the total number of nodes including deleted ones in this tree.
Definition: tree_model.h:394
void ExpandNode(bst_node_t nid, unsigned split_index, bst_float split_value, bool default_left, bst_float base_weight, bst_float left_leaf_weight, bst_float right_leaf_weight, bst_float loss_change, float sum_hess, float left_sum, float right_sum, bst_node_t leaf_right_child=kInvalidNodeId)
Expands a leaf node into two additional leaf nodes.
RegTree()
Definition: tree_model.h:239
static constexpr bst_node_t kInvalidNodeId
Definition: tree_model.h:84
void ExpandNode(bst_node_t nidx, bst_feature_t split_index, float split_cond, bool default_left, linalg::VectorView< float const > base_weight, linalg::VectorView< float const > left_weight, linalg::VectorView< float const > right_weight, float loss_chg, float sum_hess, float left_sum, float right_sum)
Expands a leaf node into two additional leaf nodes for a multi-target tree.
Node & operator[](bst_node_t nidx)
get node given nid
Definition: tree_model.h:262
static constexpr uint32_t kDeletedNodeMarker
Definition: tree_model.h:85
bool IsMultiTarget() const
Whether this is a multi-target tree.
Definition: tree_model.h:375
bst_node_t NumExtraNodes() const noexcept
number of extra nodes besides the root
Definition: tree_model.h:404
bst_node_t MaxDepth() const
Get the maximum depth.
auto GetMultiTargetTree() const
Get the underlying implementaiton of multi-target tree.
Definition: tree_model.h:383
bst_node_t LeftChild(bst_node_t nidx) const
Definition: tree_model.h:538
common::Span< RTreeNodeStat const > GetStats(DeviceOrd device) const
Get const reference to stats.
Definition: tree_model.h:273
void SetLeaves(std::vector< bst_node_t > leaves, common::Span< float const > weights)
Set all leaf weights for a multi-target tree.
void CollapseToLeaf(bst_node_t nidx, float value)
Collapse a non leaf node to a leaf node, delete its children.
Definition: tree_model.h:227
bst_node_t GetNumLeaves() const
common::Span< Node const > GetNodes(DeviceOrd device) const
Get const reference to nodes.
Definition: tree_model.h:266
RegTree(bst_target_t n_targets, bst_feature_t n_features)
Constructor that initializes the tree model with shape.
Definition: tree_model.h:253
bst_node_t RightChild(bst_node_t nidx) const
Definition: tree_model.h:544
common::Span< FeatureType const > GetSplitTypes(DeviceOrd device) const
Get split types for all nodes.
Definition: tree_model.h:495
RTreeNodeStat & Stat(int nid)
get node statistics given nid
Definition: tree_model.h:280
void SetRoot(linalg::VectorView< float const > weight, float sum_hess)
Set the root weight and statistics for a multi-target tree.
Definition: tree_model.h:421
void ExpandCategorical(bst_node_t nid, bst_feature_t split_index, common::Span< const uint32_t > split_cat, bool default_left, bst_float base_weight, bst_float left_leaf_weight, bst_float right_leaf_weight, bst_float loss_change, float sum_hess, float left_sum, float right_sum)
Expands a leaf node with categories.
bool Equal(const RegTree &b) const
Compares whether 2 trees are equal from a user's perspective. The equality compares only non-deleted ...
bst_node_t NumValidNodes() const noexcept
Get the total number of valid nodes in this tree.
Definition: tree_model.h:398
float SplitCondT
Definition: tree_model.h:83
CategoricalSplitMatrix GetCategoriesMatrix(DeviceOrd device) const
Definition: tree_model.h:525
common::Span< uint32_t const > GetSplitCategories(DeviceOrd device) const
Definition: tree_model.h:499
void LoadModel(Json const &in) override
load the model from a JSON object
std::string DumpModel(const FeatureMap &fmap, bool with_stats, std::string format) const
dump the model in the requested format as a text string
bst_feature_t NumFeatures() const noexcept
Get the number of features.
Definition: tree_model.h:390
tree::ScalarTreeView HostScView() const
bool HasCategoricalSplit() const
Whether this tree has categorical split.
Definition: tree_model.h:371
static constexpr bst_node_t kRoot
Definition: tree_model.h:86
bst_node_t GetNumSplitNodes() const
auto const & GetSplitCategoriesPtr() const
Definition: tree_model.h:504
bst_node_t GetDepth(bst_node_t nidx) const
Get the depth of a node.
bst_node_t Size() const
Definition: tree_model.h:550
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:435
constexpr XGBOOST_DEVICE pointer data() const __span_noexcept
Definition: span.h:554
constexpr XGBOOST_DEVICE index_type size() const __span_noexcept
Definition: span.h:559
A tensor view with static type and dimension. It implements indexing and slicing.
Definition: linalg.h:278
The input data structure of xgboost.
Feature map data structure to help visualization and model dump.
A device-and-host vector abstraction layer.
Linear algebra related utilities.
Defines the abstract interface for different components in XGBoost.
Learner interface that integrates objective, gbm and evaluation together. This is the user facing XGB...
Definition: base.h:89
std::int32_t bst_node_t
Type for tree node index and tree depth.
Definition: base.h:111
std::uint32_t bst_target_t
Type for indexing into output targets.
Definition: base.h:119
std::uint32_t bst_feature_t
Type for data column (feature) index.
Definition: base.h:99
float bst_float
float type, used for storing statistics
Definition: base.h:95
StringView MTNotImplemented()
Definition: tree_model.h:648
A type for device ordinal. The type is packed into 32-bit for efficient use in viewing types like lin...
Definition: context.h:34
bool IsCPU() const
Definition: context.h:45
Definition: model.h:14
node statistics used in regression tree
Definition: tree_model.h:57
RTreeNodeStat(float loss_chg, float sum_hess, float weight)
Definition: tree_model.h:68
float sum_hess
sum of hessian values, used to measure coverage of data
Definition: tree_model.h:61
int leaf_child_cnt
number of child that is leaf node known up to now
Definition: tree_model.h:65
float loss_chg
loss change caused by current split
Definition: tree_model.h:59
float base_weight
weight of current node
Definition: tree_model.h:63
bool operator==(const RTreeNodeStat &b) const
Definition: tree_model.h:70
std::size_t size
Definition: tree_model.h:518
std::size_t beg
Definition: tree_model.h:517
CSR-like matrix for categorical splits.
Definition: tree_model.h:515
common::Span< uint32_t const > categories
Definition: tree_model.h:521
common::Span< Segment const > node_ptr
Definition: tree_model.h:522
common::Span< FeatureType const > split_type
Definition: tree_model.h:520
dense feature vector that can be taken by RegTree and can be construct from sparse feature vector.
Definition: tree_model.h:434
void HasMissing(bool has_missing)
Definition: tree_model.h:469
void Drop()
drop the trace after fill, must be called after fill.
Definition: tree_model.h:633
bool HasMissing() const
Definition: tree_model.h:645
bool IsMissing(size_t i) const
check whether i-th entry is missing
Definition: tree_model.h:643
size_t Size() const
returns the size of the feature vector
Definition: tree_model.h:635
void Init(size_t size)
initialize the vector with size vector
Definition: tree_model.h:616
common::Span< float > Data()
Definition: tree_model.h:471
void Fill(SparsePage::Inst const &inst)
fill the vector with sparse vector
Definition: tree_model.h:622
bst_float GetFvalue(size_t i) const
get ith value
Definition: tree_model.h:639
Definition: string_view.h:16
meta parameters of the tree
Definition: tree_model.h:37
bst_node_t num_deleted
The number of deleted nodes.
Definition: tree_model.h:41
bst_feature_t num_feature
The number of features used for tree construction.
Definition: tree_model.h:43
bool operator==(const TreeParam &b) const
Definition: tree_model.h:47
bst_node_t num_nodes
The number of nodes.
Definition: tree_model.h:39
void ToJson(Json *p_out) const
void FromJson(Json const &in)
bst_target_t size_leaf_vector
leaf vector size. Used by the vector leaf.
Definition: tree_model.h:45