score_updater.hpp 2.91 KB
Newer Older
Guolin Ke's avatar
Guolin Ke committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef LIGHTGBM_BOOSTING_SCORE_UPDATER_HPP_
#define LIGHTGBM_BOOSTING_SCORE_UPDATER_HPP_

#include <LightGBM/meta.h>
#include <LightGBM/dataset.h>
#include <LightGBM/tree.h>
#include <LightGBM/tree_learner.h>

#include <cstring>

namespace LightGBM {
/*!
* \brief Used to store and update score for data
*/
class ScoreUpdater {
public:
  /*!
  * \brief Constructor, will pass a const pointer of dataset
  * \param data This class will bind with this data set
  */
21
  explicit ScoreUpdater(const Dataset* data, int num_class)
Guolin Ke's avatar
Guolin Ke committed
22
23
    :data_(data) {
    num_data_ = data->num_data();
24
    score_ = new score_t[num_data_ * num_class];
Guolin Ke's avatar
Guolin Ke committed
25
    // default start score is zero
26
    std::memset(score_, 0, sizeof(score_t) * num_data_ * num_class);
Guolin Ke's avatar
Guolin Ke committed
27
    const float* init_score = data->metadata().init_score();
Guolin Ke's avatar
Guolin Ke committed
28
29
    // if exists initial score, will start from it
    if (init_score != nullptr) {
30
      for (data_size_t i = 0; i < num_data_ * num_class; ++i) {
Guolin Ke's avatar
Guolin Ke committed
31
32
33
34
35
36
37
38
39
        score_[i] = init_score[i];
      }
    }
  }
  /*! \brief Destructor */
  ~ScoreUpdater() {
    delete[] score_;
  }
  /*!
Qiwei Ye's avatar
Qiwei Ye committed
40
41
  * \brief Using tree model to get prediction number, then adding to scores for all data
  *        Note: this function generally will be used on validation data too.
Guolin Ke's avatar
Guolin Ke committed
42
  * \param tree Trained tree model
43
  * \param curr_class Current class for multiclass training
Guolin Ke's avatar
Guolin Ke committed
44
  */
45
46
  inline void AddScore(const Tree* tree, int curr_class) {
    tree->AddPredictionToScore(data_, num_data_, score_ + curr_class * num_data_);
Guolin Ke's avatar
Guolin Ke committed
47
48
  }
  /*!
Qiwei Ye's avatar
Qiwei Ye committed
49
50
51
  * \brief Adding prediction score, only used for training data.
  *        The training data is partitioned into tree leaves after training
  *        Based on which We can get prediction quckily.
Guolin Ke's avatar
Guolin Ke committed
52
  * \param tree_learner
53
  * \param curr_class Current class for multiclass training
Guolin Ke's avatar
Guolin Ke committed
54
  */
55
56
  inline void AddScore(const TreeLearner* tree_learner, int curr_class) {
    tree_learner->AddPredictionToScore(score_ + curr_class * num_data_);
Guolin Ke's avatar
Guolin Ke committed
57
58
  }
  /*!
Qiwei Ye's avatar
Qiwei Ye committed
59
60
  * \brief Using tree model to get prediction number, then adding to scores for parts of data
  *        Used for prediction of training out-of-bag data
Guolin Ke's avatar
Guolin Ke committed
61
  * \param tree Trained tree model
Hui Xue's avatar
Hui Xue committed
62
63
  * \param data_indices Indices of data that will be proccessed
  * \param data_cnt Number of data that will be proccessed
64
  * \param curr_class Current class for multiclass training
Guolin Ke's avatar
Guolin Ke committed
65
66
  */
  inline void AddScore(const Tree* tree, const data_size_t* data_indices,
67
68
                                                  data_size_t data_cnt, int curr_class) {
    tree->AddPredictionToScore(data_, data_indices, data_cnt, score_ + curr_class * num_data_);
Guolin Ke's avatar
Guolin Ke committed
69
70
  }
  /*! \brief Pointer of score */
71
72
  inline const score_t* score() { return score_; }
  inline const data_size_t num_data() { return num_data_; }
Guolin Ke's avatar
Guolin Ke committed
73
74
75
76
77
private:
  /*! \brief Number of total data */
  data_size_t num_data_;
  /*! \brief Pointer of data set */
  const Dataset* data_;
78
  /*! \brief Scores for data set */
Guolin Ke's avatar
Guolin Ke committed
79
80
81
82
  score_t* score_;
};

}  // namespace LightGBM
Guolin Ke's avatar
Guolin Ke committed
83
#endif   // LightGBM_BOOSTING_SCORE_UPDATER_HPP_