| 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) { |
| 190 | return 0; |
| 191 | } |
| 192 | auto label_ptr = train_data_->metadata().label(); |
| 193 | data_size_t cur_left_cnt = 0; |
| 194 | data_size_t cur_right_pos = cnt - 1; |
| 195 | // from right to left |
| 196 | auto right_buffer = buffer; |
| 197 | // random bagging, minimal unit is one record |
| 198 | for (data_size_t i = 0; i < cnt; ++i) { |
| 199 | bool is_pos = label_ptr[start + i] > 0; |
| 200 | bool is_in_bag = false; |
| 201 | if (is_pos) { |
| 202 | is_in_bag = cur_rand->NextFloat() < config_->pos_bagging_fraction; |
| 203 | } else { |
| 204 | is_in_bag = cur_rand->NextFloat() < config_->neg_bagging_fraction; |
| 205 | } |
| 206 | if (is_in_bag) { |
| 207 | buffer[cur_left_cnt++] = start + i; |
| 208 | } else { |
| 209 | right_buffer[cur_right_pos--] = start + i; |
| 210 | } |
| 211 | } |
| 212 | // reverse right buffer |
| 213 | std::reverse(buffer + cur_left_cnt, buffer + cnt); |
| 214 | return cur_left_cnt; |
| 215 | } |
| 216 | |
| 217 | void GBDT::Bagging(int iter) { |
| 218 | // if need bagging |