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);
            }
        }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        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());
        }