| 165 | } |
| 166 | |
| 167 | data_size_t GBDT::BaggingHelper(Random* cur_rand, data_size_t start, data_size_t cnt, data_size_t* buffer) { |
| 168 | if (cnt <= 0) { |
| 169 | return 0; |
| 170 | } |
| 171 | data_size_t bag_data_cnt = static_cast<data_size_t>(config_->bagging_fraction * cnt); |
| 172 | data_size_t cur_left_cnt = 0; |
| 173 | data_size_t cur_right_cnt = 0; |
| 174 | auto right_buffer = buffer + bag_data_cnt; |
| 175 | // random bagging, minimal unit is one record |
| 176 | for (data_size_t i = 0; i < cnt; ++i) { |
| 177 | float prob = (bag_data_cnt - cur_left_cnt) / static_cast<float>(cnt - i); |
| 178 | if (cur_rand->NextFloat() < prob) { |
| 179 | buffer[cur_left_cnt++] = start + i; |
| 180 | } else { |
| 181 | right_buffer[cur_right_cnt++] = start + i; |
| 182 | } |
| 183 | } |
| 184 | CHECK(cur_left_cnt == bag_data_cnt); |
| 185 | return cur_left_cnt; |
| 186 | } |
| 187 | |
| 188 | data_size_t GBDT::BalancedBaggingHelper(Random* cur_rand, data_size_t start, data_size_t cnt, data_size_t* buffer) { |
| 189 | if (cnt <= 0) { |