public virtual void UpdateLearners(RecipeInference.SuggestedRecipe.SuggestedLearner[] availableLearners) { AvailableLearners = availableLearners; foreach (var learner in AvailableLearners) { AutoMlUtils.PopulateSweepableParams(learner); } }
public virtual void SetSpace(TransformInference.SuggestedTransform[] availableTransforms, RecipeInference.SuggestedRecipe.SuggestedLearner[] availableLearners, Func <PipelinePattern, long, bool> pipelineVerifier, IDataView originalData, IDataView fullyTransformedData, AutoInference.DependencyMap dependencyMapping, bool isMaximizingMetric) { AvailableLearners = availableLearners; AvailableTransforms = availableTransforms; PipelineVerifier = pipelineVerifier; OriginalData = originalData; FullyTransformedData = fullyTransformedData; DependencyMapping = dependencyMapping; IsMaximizingMetric = isMaximizingMetric; foreach (var learner in AvailableLearners) { AutoMlUtils.PopulateSweepableParams(learner); } }
public override PipelinePattern[] GetNextCandidates(IEnumerable <PipelinePattern> history, int numCandidates, RoleMappedData dataRoles) { var candidates = new List <PipelinePattern>(); DataRoles = dataRoles; while (candidates.Count < numCandidates) { Contracts.Assert(0 <= _currentLearnerIndex && _currentLearnerIndex < AvailableLearners.Length); // Select hyperparameters and transforms based on learner and history. PipelinePattern pipeline; int count = 0; bool valid; var learner = AvailableLearners[_currentLearnerIndex]; // Make sure sweep paramater values exist; if not, populate them from learner object. if (learner.PipelineNode.SweepParams.Any(p => p.RawValue == null)) { AutoMlUtils.PopulateSweepableParams(learner); } do { // Make sure transforms set is valid. Repeat until passes verifier. pipeline = new PipelinePattern(SampleTransforms(out var transformsBitMask), learner, "", Env); valid = PipelineVerifier(pipeline, transformsBitMask); count++; } while (!valid && count <= 1000); // Keep only valid pipelines. if (valid) { candidates.Add(pipeline); } // Update current index _currentLearnerIndex = (_currentLearnerIndex + 1) % AvailableLearners.Length; } return(candidates.ToArray()); }
private PipelinePattern[] NextCandidates(PipelinePattern[] history, int numCandidates, bool defaultHyperParams = false, bool uniformRandomTransforms = false) { const int maxNumberAttempts = 10; double[] learnerWeights = LearnerHistoryToWeights(history, IsMaximizingMetric); var candidates = new List <PipelinePattern>(); var sampledLearners = new RecipeInference.SuggestedRecipe.SuggestedLearner[numCandidates]; if (_currentStage == (int)Stages.Second || _currentStage == (int)Stages.Third) { // Select remaining learners in round-robin fashion. for (int i = 0; i < numCandidates; i++) { sampledLearners[i] = AvailableLearners[i % AvailableLearners.Length].Clone(); } } else { // Select learners, based on weights. var indices = ProbUtils.SampleCategoricalDistribution(numCandidates, learnerWeights); foreach (var item in indices.Select((idx, i) => new { idx, i })) { sampledLearners[item.i] = AvailableLearners[item.idx].Clone(); } } // Select hyperparameters and transforms based on learner and history. foreach (var learner in sampledLearners) { PipelinePattern pipeline; int count = 0; bool valid; string hashKey; if (!defaultHyperParams) { SampleHyperparameters(learner, history); } else { AutoMlUtils.PopulateSweepableParams(learner); } do { // Make sure transforms set is valid and have not seen pipeline before. // Repeat until passes or runs out of chances. pipeline = new PipelinePattern( SampleTransforms(learner, history, out var transformsBitMask, uniformRandomTransforms), learner, "", Env); hashKey = GetHashKey(transformsBitMask, learner); valid = PipelineVerifier(pipeline, transformsBitMask) && !VisitedPipelines.Contains(hashKey); count++; } while (!valid && count <= maxNumberAttempts); // If maxed out chances and at second stage, move onto next stage. if (count >= maxNumberAttempts && _currentStage == (int)Stages.Second) { _currentStage++; } // Keep only valid pipelines. if (valid) { VisitedPipelines.Add(hashKey); candidates.Add(pipeline); } } return(candidates.ToArray()); }