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

Method GetUsedFeatures

src/treelearner/serial_tree_learner2.cpp:332–380  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

330}
331
332std::vector<int8_t> SerialTreeLearner2::GetUsedFeatures(bool is_tree_level) {
333 std::vector<int8_t> ret(num_features_, 1);
334 if (config_->feature_fraction >= 1.0f && is_tree_level) {
335 return ret;
336 }
337 if (config_->feature_fraction_bynode >= 1.0f && !is_tree_level) {
338 return ret;
339 }
340 std::memset(ret.data(), 0, sizeof(int8_t) * num_features_);
341 const int min_used_features = std::min(2, static_cast<int>(valid_feature_indices_.size()));
342 if (is_tree_level) {
343 int used_feature_cnt = static_cast<int>(std::round(valid_feature_indices_.size() * config_->feature_fraction));
344 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
345 used_feature_indices_ = random_.Sample(static_cast<int>(valid_feature_indices_.size()), used_feature_cnt);
346 int omp_loop_size = static_cast<int>(used_feature_indices_.size());
347 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
348 for (int i = 0; i < omp_loop_size; ++i) {
349 int used_feature = valid_feature_indices_[used_feature_indices_[i]];
350 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
351 CHECK(inner_feature_index >= 0);
352 ret[inner_feature_index] = 1;
353 }
354 } else if (used_feature_indices_.size() <= 0) {
355 int used_feature_cnt = static_cast<int>(std::round(valid_feature_indices_.size() * config_->feature_fraction_bynode));
356 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
357 auto sampled_indices = random_.Sample(static_cast<int>(valid_feature_indices_.size()), used_feature_cnt);
358 int omp_loop_size = static_cast<int>(sampled_indices.size());
359 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
360 for (int i = 0; i < omp_loop_size; ++i) {
361 int used_feature = valid_feature_indices_[sampled_indices[i]];
362 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
363 CHECK(inner_feature_index >= 0);
364 ret[inner_feature_index] = 1;
365 }
366 } else {
367 int used_feature_cnt = static_cast<int>(std::round(used_feature_indices_.size() * config_->feature_fraction_bynode));
368 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
369 auto sampled_indices = random_.Sample(static_cast<int>(used_feature_indices_.size()), used_feature_cnt);
370 int omp_loop_size = static_cast<int>(sampled_indices.size());
371 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
372 for (int i = 0; i < omp_loop_size; ++i) {
373 int used_feature = valid_feature_indices_[used_feature_indices_[sampled_indices[i]]];
374 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
375 CHECK(inner_feature_index >= 0);
376 ret[inner_feature_index] = 1;
377 }
378 }
379 return ret;
380}
381
382void SerialTreeLearner2::BeforeTrain() {
383 // reset histogram pool

Callers

nothing calls this directly

Calls 4

dataMethod · 0.80
sizeMethod · 0.45
SampleMethod · 0.45
InnerFeatureIndexMethod · 0.45

Tested by

no test coverage detected