示例#1
0
        /// <summary>
        /// Samples new hyperparameters for the trainer, and sets them.
        /// Returns true if success (new hyperparameters were suggested and set). Else, returns false.
        /// </summary>
        private static bool SampleHyperparameters(MLContext context, SuggestedTrainer trainer, IEnumerable <SuggestedPipelineRunDetail> history, bool isMaximizingMetric)
        {
            var sps     = ConvertToValueGenerators(trainer.SweepParams);
            var sweeper = new SmacSweeper(context,
                                          new SmacSweeper.Arguments
            {
                SweptParameters = sps
            });

            IEnumerable <SuggestedPipelineRunDetail> historyToUse = history
                                                                    .Where(r => r.RunSucceeded && r.Pipeline.Trainer.TrainerName == trainer.TrainerName && r.Pipeline.Trainer.HyperParamSet != null && r.Pipeline.Trainer.HyperParamSet.Any());

            // get new set of hyperparameter values
            var proposedParamSet = sweeper.ProposeSweeps(1, historyToUse.Select(h => h.ToRunResult(isMaximizingMetric))).First();

            if (!proposedParamSet.Any())
            {
                return(false);
            }

            // associate proposed parameter set with trainer, so that smart hyperparameter
            // sweepers (like KDO) can map them back.
            trainer.SetHyperparamValues(proposedParamSet);

            return(true);
        }
 public SuggestedPipeline(IEnumerable <SuggestedTransform> transforms,
                          IEnumerable <SuggestedTransform> transformsPostTrainer,
                          SuggestedTrainer trainer,
                          MLContext context,
                          bool cacheBeforeTrainer)
 {
     Transforms            = transforms.Select(t => t.Clone()).ToList();
     TransformsPostTrainer = transformsPostTrainer.Select(t => t.Clone()).ToList();
     Trainer             = trainer.Clone();
     _context            = context;
     _cacheBeforeTrainer = cacheBeforeTrainer;
 }
示例#3
0
        public static SuggestedPipeline Build(MLContext context,
                                              ICollection <SuggestedTransform> transforms,
                                              ICollection <SuggestedTransform> transformsPostTrainer,
                                              SuggestedTrainer trainer,
                                              CacheBeforeTrainer cacheBeforeTrainerSettings)
        {
            var trainerInfo = trainer.BuildTrainer().Info;

            AddNormalizationTransforms(context, trainerInfo, transforms);
            var cacheBeforeTrainer = ShouldCacheBeforeTrainer(trainerInfo, cacheBeforeTrainerSettings);

            return(new SuggestedPipeline(transforms, transformsPostTrainer, trainer, context, cacheBeforeTrainer));
        }
        /// <summary>
        /// Given a predictor type, return a set of all permissible trainers (with their sweeper params, if defined).
        /// </summary>
        /// <returns>Array of viable learners.</returns>
        public static IEnumerable <SuggestedTrainer> AllowedTrainers(MLContext mlContext, TaskKind task,
                                                                     ColumnInformation columnInfo, IEnumerable <TrainerName> trainerWhitelist)
        {
            var trainerExtensions = TrainerExtensionCatalog.GetTrainers(task, trainerWhitelist, columnInfo);

            var trainers = new List <SuggestedTrainer>();

            foreach (var trainerExtension in trainerExtensions)
            {
                var learner = new SuggestedTrainer(mlContext, trainerExtension, columnInfo);
                trainers.Add(learner);
            }
            return(trainers.ToArray());
        }
        public static SuggestedPipeline FromPipeline(MLContext context, Pipeline pipeline)
        {
            var transforms            = new List <SuggestedTransform>();
            var transformsPostTrainer = new List <SuggestedTransform>();
            SuggestedTrainer trainer  = null;

            var trainerEncountered = false;

            foreach (var pipelineNode in pipeline.Nodes)
            {
                if (pipelineNode.NodeType == PipelineNodeType.Trainer)
                {
                    var trainerName      = (TrainerName)Enum.Parse(typeof(TrainerName), pipelineNode.Name);
                    var trainerExtension = TrainerExtensionCatalog.GetTrainerExtension(trainerName);
                    var hyperParamSet    = TrainerExtensionUtil.BuildParameterSet(trainerName, pipelineNode.Properties);
                    var columnInfo       = TrainerExtensionUtil.BuildColumnInfo(pipelineNode.Properties);
                    trainer            = new SuggestedTrainer(context, trainerExtension, columnInfo, hyperParamSet);
                    trainerEncountered = true;
                }
                else if (pipelineNode.NodeType == PipelineNodeType.Transform)
                {
                    var estimatorName      = (EstimatorName)Enum.Parse(typeof(EstimatorName), pipelineNode.Name);
                    var estimatorExtension = EstimatorExtensionCatalog.GetExtension(estimatorName);
                    var estimator          = estimatorExtension.CreateInstance(context, pipelineNode);
                    var transform          = new SuggestedTransform(pipelineNode, estimator);
                    if (!trainerEncountered)
                    {
                        transforms.Add(transform);
                    }
                    else
                    {
                        transformsPostTrainer.Add(transform);
                    }
                }
            }

            return(new SuggestedPipeline(transforms, transformsPostTrainer, trainer, context, pipeline.CacheBeforeTrainer));
        }
示例#6
0
        /// <summary>
        /// Samples new hyperparameters for the trainer, and sets them.
        /// Returns true if success (new hyperparameters were suggested and set). Else, returns false.
        /// </summary>
        private static bool SampleHyperparameters(MLContext context, SuggestedTrainer trainer,
                                                  IEnumerable <SuggestedPipelineRunDetail> history, bool isMaximizingMetric, IChannel logger)
        {
            try
            {
                var sps     = ConvertToValueGenerators(trainer.SweepParams);
                var sweeper = new SmacSweeper(context,
                                              new SmacSweeper.Arguments
                {
                    SweptParameters = sps
                });

                IEnumerable <SuggestedPipelineRunDetail> historyToUse = history
                                                                        .Where(r => r.RunSucceeded && r.Pipeline.Trainer.TrainerName == trainer.TrainerName &&
                                                                               r.Pipeline.Trainer.HyperParamSet != null &&
                                                                               r.Pipeline.Trainer.HyperParamSet.Any() &&
                                                                               FloatUtils.IsFinite(r.Score));

                // get new set of hyperparameter values
                var proposedParamSet = sweeper.ProposeSweeps(1, historyToUse.Select(h => h.ToRunResult(isMaximizingMetric))).FirstOrDefault();
                if (!proposedParamSet.Any())
                {
                    return(false);
                }

                // associate proposed parameter set with trainer, so that smart hyperparameter
                // sweepers (like KDO) can map them back.
                trainer.SetHyperparamValues(proposedParamSet);

                return(true);
            }
            catch (Exception ex)
            {
                logger.Error($"SampleHyperparameters failed with exception: {ex}");
                throw;
            }
        }