/// <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; }
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)); }
/// <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; } }