| 565 | |
| 566 | |
| 567 | static TVector<TTrainingDataProviders> UpdateIgnoredFeaturesInLearn( |
| 568 | const NCatboostOptions::TFeatureEvalOptions& options, |
| 569 | ETrainingKind trainingKind, |
| 570 | ui32 testedFeatureSetIdx, |
| 571 | const TVector<TTrainingDataProviders>& foldsData |
| 572 | ) { |
| 573 | TVector<ui32> ignoredFeatures; |
| 574 | const auto& testedFeatures = options.FeaturesToEvaluate.Get(); |
| 575 | const auto featureEvalMode = options.FeatureEvalMode; |
| 576 | if (trainingKind == ETrainingKind::Testing) { |
| 577 | if (featureEvalMode == NCB::EFeatureEvalMode::OthersVsAll) { |
| 578 | ignoredFeatures = testedFeatures[testedFeatureSetIdx]; |
| 579 | } else { |
| 580 | THashSet<ui32> ignoredFeaturesAsSet; |
| 581 | for (const auto& featureSet : testedFeatures) { |
| 582 | ignoredFeaturesAsSet.insert(featureSet.begin(), featureSet.end()); |
| 583 | } |
| 584 | for (ui32 featureIdx : testedFeatures[testedFeatureSetIdx]) { |
| 585 | ignoredFeaturesAsSet.erase(featureIdx); |
| 586 | } |
| 587 | ignoredFeatures.insert(ignoredFeatures.end(), ignoredFeaturesAsSet.begin(), ignoredFeaturesAsSet.end()); |
| 588 | } |
| 589 | } else if (EqualToOneOf(featureEvalMode, NCB::EFeatureEvalMode::OneVsAll, NCB::EFeatureEvalMode::OthersVsAll)) { |
| 590 | // no additional ignored features |
| 591 | } else if (featureEvalMode == NCB::EFeatureEvalMode::OneVsOthers) { |
| 592 | ignoredFeatures = testedFeatures[testedFeatureSetIdx]; |
| 593 | } else { |
| 594 | CB_ENSURE( |
| 595 | featureEvalMode == NCB::EFeatureEvalMode::OneVsNone, |
| 596 | "Unknown feature evaluation mode " + ToString(featureEvalMode) |
| 597 | ); |
| 598 | for (const auto& featureSet : testedFeatures) { |
| 599 | ignoredFeatures.insert( |
| 600 | ignoredFeatures.end(), |
| 601 | featureSet.begin(), |
| 602 | featureSet.end()); |
| 603 | } |
| 604 | } |
| 605 | |
| 606 | TStringBuilder logMessage; |
| 607 | logMessage << "Feature set " << testedFeatureSetIdx; |
| 608 | if (trainingKind == ETrainingKind::Baseline) { |
| 609 | logMessage << ", baseline"; |
| 610 | } else { |
| 611 | logMessage << ", testing"; |
| 612 | } |
| 613 | if (ignoredFeatures.empty()) { |
| 614 | logMessage << ", no additional ignored features"; |
| 615 | } else { |
| 616 | std::sort(ignoredFeatures.begin(), ignoredFeatures.end()); |
| 617 | logMessage << ", additional ignored features " << JoinRange(":", ignoredFeatures.begin(), ignoredFeatures.end()); |
| 618 | } |
| 619 | CATBOOST_INFO_LOG << logMessage << Endl; |
| 620 | |
| 621 | TVector<TTrainingDataProviders> result; |
| 622 | result.reserve(foldsData.size()); |
| 623 | |
| 624 | for (const auto& foldData : foldsData) { |
no test coverage detected