MCPcopy Create free account
hub / github.com/antmachineintelligence/mtgbmcode / TrainOneIter_new

Method TrainOneIter_new

src/boosting/gbdt.cpp:467–548  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

465
466
467bool GBDT::TrainOneIter_new(const score_t* gradients, const score_t* hessians,const score_t* gradients2, const score_t* hessians2) {
468 std::vector<double> init_scores(num_tree_per_iteration_, 0.0);
469
470 // bagging logic
471 Bagging(iter_);
472
473 bool should_continue = false;
474 for (int cur_tree_id = 0; cur_tree_id < num_tree_per_iteration_; ++cur_tree_id) {
475 const size_t offset = static_cast<size_t>(cur_tree_id) * num_data_;
476 for (int cur_tree_id2 = 0; cur_tree_id2 < config_->num_labels; ++cur_tree_id2) {
477 const size_t offset2 = static_cast<size_t>(cur_tree_id2) * num_data_;
478 std::unique_ptr<Tree> new_tree(new Tree(2));
479
480 if (class_need_train_[cur_tree_id] && train_data_->num_features() > 0) {
481 auto grad = gradients + offset;
482 auto hess = hessians + offset;
483 auto grad2 = gradients2 + offset2;
484 auto hess2 = hessians2 + offset2;
485 if (is_use_subset_ && bag_data_cnt_ < num_data_) {
486
487 for (int i = 0; i < bag_data_cnt_; ++i) {
488 gradients_[offset + i] = grad[bag_data_indices_[i]];
489 hessians_[offset + i] = hess[bag_data_indices_[i]];
490 }
491 grad = gradients_.data() + offset;
492 hess = hessians_.data() + offset;
493 }
494 new_tree.reset(tree_learner_->Train(grad, hess, is_constant_hessian_, forced_splits_json_));
495// new_tree.reset(tree_learner_->Train_serial2(grad, hess,grad, hess, is_constant_hessian_, forced_splits_json_));
496 tree_learner_->Train_serial2(new_tree.get(), grad2, hess2);
497 }
498
499
500 if (new_tree->num_leaves() > 1) {
501 should_continue = true;
502 auto score_ptr = train_score_updater_->score() + offset2;
503 auto residual_getter = [score_ptr](const label_t* label, int i) {return static_cast<double>(label[i]) - score_ptr[i]; };
504// tree_learner_->RenewTreeOutput(new_tree.get(), objective_function_, residual_getter,
505// num_data_, bag_data_indices_.data(), bag_data_cnt_);
506 // shrinkage by learning rate
507 new_tree->Shrinkage(shrinkage_rate_);
508 // update score
509 UpdateScore(new_tree.get(), cur_tree_id2);
510 if (std::fabs(init_scores[cur_tree_id]) > kEpsilon) {
511 Log::Warning("please set grad and hess both.");
512 new_tree->AddBias(init_scores[cur_tree_id]);
513 }
514 } else {
515 // only add default score one-time
516 if (models_.size() < static_cast<size_t>(num_tree_per_iteration_)) {
517 double output = 0.0;
518 if (!class_need_train_[cur_tree_id2]) {
519 if (objective_function_ != nullptr) {
520 output = objective_function_->BoostFromScore(cur_tree_id2);
521 }
522 } else {
523 output = init_scores[cur_tree_id];
524 }

Callers

nothing calls this directly

Calls 15

dataMethod · 0.80
resetMethod · 0.80
push_backMethod · 0.80
pop_backMethod · 0.80
num_featuresMethod · 0.45
TrainMethod · 0.45
Train_serial2Method · 0.45
getMethod · 0.45
num_leavesMethod · 0.45
scoreMethod · 0.45
ShrinkageMethod · 0.45
AddBiasMethod · 0.45

Tested by

no test coverage detected