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

Method GetUsedFeatures

src/treelearner/serial_tree_learner.cpp:271–319  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

269}
270
271std::vector<int8_t> SerialTreeLearner::GetUsedFeatures(bool is_tree_level) {
272 std::vector<int8_t> ret(num_features_, 1);
273 if (config_->feature_fraction >= 1.0f && is_tree_level) {
274 return ret;
275 }
276 if (config_->feature_fraction_bynode >= 1.0f && !is_tree_level) {
277 return ret;
278 }
279 std::memset(ret.data(), 0, sizeof(int8_t) * num_features_);
280 const int min_used_features = std::min(2, static_cast<int>(valid_feature_indices_.size()));
281 if (is_tree_level) {
282 int used_feature_cnt = static_cast<int>(std::round(valid_feature_indices_.size() * config_->feature_fraction));
283 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
284 used_feature_indices_ = random_.Sample(static_cast<int>(valid_feature_indices_.size()), used_feature_cnt);
285 int omp_loop_size = static_cast<int>(used_feature_indices_.size());
286 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
287 for (int i = 0; i < omp_loop_size; ++i) {
288 int used_feature = valid_feature_indices_[used_feature_indices_[i]];
289 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
290 CHECK(inner_feature_index >= 0);
291 ret[inner_feature_index] = 1;
292 }
293 } else if (used_feature_indices_.size() <= 0) {
294 int used_feature_cnt = static_cast<int>(std::round(valid_feature_indices_.size() * config_->feature_fraction_bynode));
295 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
296 auto sampled_indices = random_.Sample(static_cast<int>(valid_feature_indices_.size()), used_feature_cnt);
297 int omp_loop_size = static_cast<int>(sampled_indices.size());
298 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
299 for (int i = 0; i < omp_loop_size; ++i) {
300 int used_feature = valid_feature_indices_[sampled_indices[i]];
301 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
302 CHECK(inner_feature_index >= 0);
303 ret[inner_feature_index] = 1;
304 }
305 } else {
306 int used_feature_cnt = static_cast<int>(std::round(used_feature_indices_.size() * config_->feature_fraction_bynode));
307 used_feature_cnt = std::max(used_feature_cnt, min_used_features);
308 auto sampled_indices = random_.Sample(static_cast<int>(used_feature_indices_.size()), used_feature_cnt);
309 int omp_loop_size = static_cast<int>(sampled_indices.size());
310 #pragma omp parallel for schedule(static, 512) if (omp_loop_size >= 1024)
311 for (int i = 0; i < omp_loop_size; ++i) {
312 int used_feature = valid_feature_indices_[used_feature_indices_[sampled_indices[i]]];
313 int inner_feature_index = train_data_->InnerFeatureIndex(used_feature);
314 CHECK(inner_feature_index >= 0);
315 ret[inner_feature_index] = 1;
316 }
317 }
318 return ret;
319}
320
321void SerialTreeLearner::BeforeTrain() {
322 // reset histogram pool

Calls 4

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

Tested by

no test coverage detected