Поделиться через


Использование API автоматизированного Машинное обучение ML.NET (AutoML)

Из этой статьи вы узнаете, как использовать ML.NET автоматизированного машинного обучения (API AutoML).

Примеры ДЛЯ API AutoML можно найти в репозитории dotnet/machinelearning-samples .

Установка

Чтобы использовать API AutoML, установите Microsoft.ML.AutoML пакет NuGet в проекте .NET, на который вы хотите ссылаться.

Примечание.

В этом руководстве используется версия 0.20.0 и более поздняя Microsoft.ML.AutoML версия пакета NuGet. Хотя примеры и код из предыдущих версий по-прежнему работают, настоятельно рекомендуется использовать API, представленные в этой версии для новых проектов.

Дополнительные сведения об установке пакетов NuGet см. в следующих руководствах.

Краткая инструкция

AutoML предоставляет несколько стандартных значений для быстрого обучения моделей машинного обучения. В этом разделе описано, как:

  • Загрузка данных
  • Определение конвейера
  • Настройка эксперимента
  • Запуск эксперимента
  • Используйте лучшую модель для прогнозирования

Определение проблемы

Учитывая набор данных, хранящийся в разделенном запятыми файле с именем taxi-fare-train.csv , который выглядит следующим образом:

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type fare_amount
CMT 1 1 1271 3,8 CRD 17,5
CMT 1 1 474 1.5 CRD 8
CMT 1 1 637 1.4 CRD 8.5

Загрузка данных

Начните с инициализации.MLContext MLContext — это отправная точка для всех ML.NET операций. Инициализация mlContext создает новую среду ML.NET, которую можно совместно использовать для объектов рабочего процесса создания модели. По существу он аналогичен классу DBContext в Entity Framework.

Затем, чтобы загрузить данные, используйте InferColumns этот метод.

// Initialize MLContext
MLContext ctx = new MLContext();

// Define data path
var dataPath = Path.GetFullPath(@"..\..\..\..\Data\taxi-fare-train.csv");

// Infer column information
ColumnInferenceResults columnInference =
    ctx.Auto().InferColumns(dataPath, labelColumnName: "fare_amount", groupColumns: false);

InferColumns загружает несколько строк из набора данных. Затем он проверяет данные и пытается угадать или определить тип данных для каждого столбца на основе их содержимого.

Поведение по умолчанию — группировать столбцы одного типа в векторы функций или массивы, содержащие элементы для каждого из отдельных столбцов. Параметр groupColumns переопределяет false поведение по умолчанию и выполняет вывод столбцов только без группировки столбцов. Сохраняя отдельные столбцы, вы можете применять различные преобразования данных при предварительной обработке данных на уровне отдельного столбца, а не группирования столбцов.

Результатом InferColumns является ColumnInferenceResults объект, содержащий параметры, необходимые для создания TextLoader , а также сведений о столбцах.

Для примера набора данных в taxi-fare-train.csv сведения о столбцах могут выглядеть следующим образом:

  • LabelColumnName: fare_amount
  • CategoricalColumnNames: vendor_id, payment_type
  • NumericColumnNames: rate_code, passenger_count, trip_time_in_secs, trip_distance

После получения сведений о столбце используйте TextLoader.Options определенный ColumnInferenceResults параметр для создания TextLoader данных для загрузки данных в объект IDataView.

// Create text loader
TextLoader loader = ctx.Data.CreateTextLoader(columnInference.TextLoaderOptions);

// Load data into IDataView
IDataView data = loader.Load(dataPath);

Часто рекомендуется разделить данные на наборы обучения и проверки. Используется TrainTestSplit для создания 80 % обучения и 20 % разделения проверки набора данных.

TrainTestData trainValidationData = ctx.Data.TrainTestSplit(data, testFraction: 0.2);

Определение конвейера

Конвейер определяет шаги обработки данных и конвейер машинного обучения для обучения модели.

SweepablePipeline pipeline =
    ctx.Auto().Featurizer(data, columnInformation: columnInference.ColumnInformation)
        .Append(ctx.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName));

A SweepablePipeline — это коллекция SweepableEstimator. A SweepableEstimator — это ML.NET Estimator с SearchSpace.

Это Featurizer удобный API, который создает масштабируемый конвейер обработки данных, доступный для оценки на основе предоставленных вами сведений о столбцах. Вместо создания конвейера с нуля Featurizer автоматизирует этап предварительной обработки данных. Дополнительные сведения о поддерживаемых преобразованиях по ML.NET см. в руководстве по преобразованиям данных.

Выходные Featurizer данные — это один столбец, содержащий числовый вектор признаков, представляющий преобразованные данные для каждого столбца. Затем этот вектор признаков используется в качестве входных данных для алгоритмов, используемых для обучения модели машинного обучения.

Если требуется более точное управление предварительной обработкой данных, можно создать конвейер с каждым из отдельных шагов предварительной обработки. Дополнительные сведения см. в руководстве по подготовке данных по созданию модели.

Совет

Используется Featurizer для ColumnInferenceResults максимального увеличения служебной программы AutoML.

Для обучения AutoML предоставляет доступный конвейер с обучаемыми средствами по умолчанию и конфигурациями пространства поиска для следующих задач машинного обучения:

Для проблемы прогнозирования тарифа на такси, так как цель заключается в прогнозировании числового значения, используйте Regression. Дополнительные сведения о выборе задачи см. в разделе "Задачи машинного обучения" в ML.NET

Настройка эксперимента

Сначала создайте эксперимент AutoML. А AutoMLExperiment — это коллекция TrialResult.

AutoMLExperiment experiment = ctx.Auto().CreateExperiment();

После создания эксперимента используйте методы расширения, которые он предоставляет для настройки различных параметров.

experiment
    .SetPipeline(pipeline)
    .SetRegressionMetric(RegressionMetric.RSquared, labelColumn: columnInference.ColumnInformation.LabelColumnName)
    .SetTrainingTimeInSeconds(60)
    .SetDataset(trainValidationData);

В этом примере вы:

  • Задайте масштабируемый конвейер для запуска во время эксперимента путем вызова SetPipeline.
  • Выберите RSquared в качестве метрики для оптимизации во время обучения путем вызова SetRegressionMetric. Дополнительные сведения о метриках оценки см. в руководстве по оценке модели ML.NET с помощью руководства по метрикам .
  • Задайте 60 секунд в качестве времени, для которого требуется обучить, вызвав.SetTrainingTimeInSeconds Хорошая эвристика, чтобы определить, сколько времени нужно обучить, является размером данных. Как правило, для больших наборов данных требуется больше времени обучения. Дополнительные сведения см . в руководстве по обучению.
  • Предоставьте наборы данных для обучения и проверки для использования путем вызова SetDataset.

После определения эксперимента вам потребуется какой-то способ отслеживать его ход выполнения. Самый быстрый способ отслеживания Log хода выполнения — изменение события из MLContext.

// Log experiment trials
ctx.Log += (_, e) => {
    if (e.Source.Equals("AutoMLExperiment"))
    {
        Console.WriteLine(e.RawMessage);
    }
};

Запуск эксперимента

Теперь, когда вы определили эксперимент, используйте RunAsync метод для запуска эксперимента.

TrialResult experimentResults = await experiment.RunAsync();

После истечения срока действия обучения результатом является TrialResult лучшая модель, найденная во время обучения.

На этом этапе можно сохранить модель или использовать ее для прогнозирования. Дополнительные сведения об использовании модели ML.NET см. в следующих руководствах.

Изменение результатов вывода столбцов

Так как InferColumns загружается только подмножество данных, возможно, что пограничные случаи, содержащиеся за пределами примеров, используемых для вывода столбцов, не перехватываются, а неправильные типы данных задаются для столбцов. Вы можете обновить свойства учетной записи в тех случаях, когда результаты вывода столбца ColumnInformation не верны.

Например, в наборе данных тарифа на такси данные в столбце rate_code — это число. Однако это числовое значение представляет категорию. По умолчанию вызов InferColumns будет размещаться rate_code в свойстве NumericColumnNames вместо CategoricalColumnNames. Так как эти свойства являются коллекциями .NET, можно использовать стандартные операции для добавления и удаления элементов из них.

Чтобы обновить ColumnInformation значение для rate_codeэтого, выполните указанные ниже действия.

columnInference.ColumnInformation.NumericColumnNames.Remove("rate_code");
columnInference.ColumnInformation.CategoricalColumnNames.Add("rate_code");

Исключение тренеров

По умолчанию AutoML пытается выполнить несколько тренеров в рамках процесса обучения, чтобы узнать, какой из них лучше всего подходит для ваших данных. Однако на протяжении всего процесса обучения вы можете обнаружить, что есть некоторые тренеры, которые используют слишком много вычислительных ресурсов или не предоставляют хорошие метрики оценки. Вы можете исключить тренеров из процесса обучения. Какие обучающие средства используются, зависят от задачи. Список поддерживаемых тренеров в ML.NET см . в разделе "Задачи машинного обучения" в ML.NET руководстве.

Например, в сценарии регрессии тарифа на такси, чтобы исключить алгоритм LightGBM, задайте useLgbm для параметра значение false.

ctx.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName, useLgbm:false)

Процесс исключения тренеров в других задачах, таких как двоичная и многоклассовая классификация, работает так же.

Настройка масштабируемого оценщика

Если требуется более детализированная настройка параметров оценки, включенных в состав масштабируемого конвейера, необходимо выполнить следующие действия.

  1. Инициализация пространства поиска
  2. Использование пространства поиска для определения пользовательской фабрики
  3. Создание масштабируемого оценщика
  4. Добавление масштабируемого оценщика в доступный конвейер

AutoML предоставляет набор предварительно настроенных пространств поиска для тренеров в следующих задачах машинного обучения:

В этом примере для пространства поиска используется SdcaRegressionTrainerпространство поиска. Инициализировать его с помощью SdcaOption.

var sdcaSearchSpace = new SearchSpace<SdcaOption>();

Затем используйте пространство поиска для определения пользовательского метода фабрики для создания SdcaRegressionTrainerобъекта. В этом примере значения L1Regularization и L2Regularization оба значения задаются как нечто, отличное от значения по умолчанию. Для L1Regularizationэтого набор значений определяется настройщиком во время каждой пробной версии. Исправлено L2Regularization для каждой пробной версии до жестко закодированного значения. Во время каждой пробной версии выходные данные настраиваемой фабрики — это SdcaRegressionTrainer настроенные гиперпараметры.

// Use the search space to define a custom factory to create an SdcaRegressionTrainer
var sdcaFactory = (MLContext ctx, SdcaOption param) =>
{
    var sdcaOption = new SdcaRegressionTrainer.Options();
    sdcaOption.L1Regularization = param.L1Regularization;
    sdcaOption.L2Regularization = 0.02f;

    sdcaOption.LabelColumnName = columnInference.ColumnInformation.LabelColumnName;

    return ctx.Regression.Trainers.Sdca(sdcaOption);
};

Свертываемый оценщик — это сочетание оценщика и пространства поиска. Теперь, когда вы определили пространство поиска и использовали его для создания настраиваемого метода фабрики для создания тренеров, используйте CreateSweepableEstimator этот метод, чтобы создать новый масштабируемый оценщик.

// Define Sdca sweepable estimator (SdcaRegressionTrainer + SdcaOption search space)
var sdcaSweepableEstimator = ctx.Auto().CreateSweepableEstimator(sdcaFactory, sdcaSearchSpace);

Чтобы использовать масштабируемый оценщик в эксперименте, добавьте его в доступный конвейер.

SweepablePipeline pipeline =
    ctx.Auto().Featurizer(data, columnInformation: columnInference.ColumnInformation)
        .Append(sdcaSweepableEstimator);

Так как доступные конвейеры являются коллекцией подметаемых оценщиков, вы можете настроить и настроить как можно больше из этих масштабируемых оценщиков.

Настройка пространства поиска

Существуют сценарии, в которых вы хотите перейти за рамки настройки масштабируемых оценщиков, используемых в эксперименте, и хотите управлять диапазоном пространства поиска. Для этого можно получить доступ к свойствам пространства поиска с помощью ключей. В этом случае L1Regularization параметр является параметром float. Таким образом, чтобы настроить диапазон поиска, используйте UniformSingleOption.

sdcaSearchSpace["L1Regularization"] = new UniformSingleOption(min: 0.01f, max: 2.0f, logBase: false, defaultValue: 0.01f);

В зависимости от типа данных гиперпараметра, который требуется задать, можно выбрать один из следующих вариантов:

Пространства поиска также могут содержать вложенные пространства поиска.

var searchSpace = new SearchSpace();
searchSpace["SingleOption"] = new UniformSingleOption(min:-10f, max:10f, defaultValue=0f) 
var nestedSearchSpace = new SearchSpace();
nestedSearchSpace["IntOption"] = new UniformIntOption(min:-10, max:10, defaultValue=0);
searchSpace["Nest"] = nestedSearchSpace;

Другим вариантом настройки диапазонов поиска является расширение их. Например, SdcaOption предоставляет только параметры L1Regularization и L2Regularization параметры. Однако имеет больше параметров, SdcaRegressionTrainer которые можно задать, например BiasLearningRate.

Чтобы расширить пространство поиска, создайте новый класс, например SdcaExtendedOption, который наследует от SdcaOption.

public class SdcaExtendedOption : SdcaOption
{
    [Range(0.10f, 1f, 0.01f)]
    public float BiasLearningRate {get;set;}   
}

Чтобы указать диапазон пространства поиска, используйте RangeAttribute, что эквивалентно Microsoft.ML.SearchSpace.Option.

Затем в любом месте, где вы используете пространство поиска, наведите ссылку SdcaExtendedOption вместо SdcaOption.

Например, при инициализации пространства поиска можно сделать следующее:

var sdcaSearchSpace = new SearchSpace<SdcaExtendedOption>();

Создание собственного тестового средства выполнения пробной версии

По умолчанию AutoML поддерживает двоичную классификацию, многоклассовую классификацию и регрессию. Однако ML.NET поддерживает множество других сценариев, таких как:

  • Рекомендация
  • Прогнозирование
  • Рейтинг
  • Классификация изображений
  • Классификация текстов
  • Сходство предложений

Для сценариев, которые не имеют предварительно настроенных пространств поиска и доступных средств оценки, можно создать собственный и использовать средство выполнения пробной версии, чтобы включить AutoML для этого сценария.

Например, учитывая данные проверки ресторана, которые выглядят следующим образом:

Ой... Любил это место.

1

Корочка так себе.

0

Вы хотите использовать TextClassificationTrainer тренер для анализа тональности, где 0 является отрицательным и 1 положительным. Однако конфигурация отсутствует ctx.Auto().TextClassification() .

Чтобы использовать AutoML с тренером классификации текста, необходимо выполнить следующие действия.

  1. Создайте собственное пространство поиска.

    // Define TextClassification search space
    public class TCOption
    {
        [Range(64, 128, 32)]
        public int BatchSize { get; set; }
    }
    

    В этом случае AutoML будет искать различные конфигурации гиперпараметра BatchSize .

  2. Создайте масштабируемый оценщик и добавьте его в конвейер.

    // Initialize search space
    var tcSearchSpace = new SearchSpace<TCOption>();
    
    // Create factory for Text Classification trainer
    var tcFactory = (MLContext ctx, TCOption param) =>
    {
        return ctx.MulticlassClassification.Trainers.TextClassification(
            sentence1ColumnName: textColumnName,
            batchSize:param.BatchSize);
    };
    
    // Create text classification sweepable estimator
    var tcEstimator = 
        ctx.Auto().CreateSweepableEstimator(tcFactory, tcSearchSpace);
    
    // Define text classification pipeline
    var pipeline =
        ctx.Transforms.Conversion.MapValueToKey(columnInference.ColumnInformation.LabelColumnName)
            .Append(tcEstimator);
    

    В этом примере TCOption пространство поиска и настраиваемая TextClassificationTrainer фабрика используются для создания масштабируемого оценщика.

  3. Создание настраиваемого средства выполнения пробной версии

    Чтобы создать настраиваемую пробную версию runner, реализуйте ITrialRunner:

    public class TCRunner : ITrialRunner
    {
        private readonly MLContext _context;
        private readonly TrainTestData _data;
        private readonly IDataView _trainDataset;
        private readonly IDataView _evaluateDataset;
        private readonly SweepablePipeline _pipeline;
        private readonly string _labelColumnName;
        private readonly MulticlassClassificationMetric _metric;
    
        public TCRunner(
            MLContext context, 
            TrainTestData data, 
            SweepablePipeline pipeline,
            string labelColumnName = "Label", 
            MulticlassClassificationMetric metric = MulticlassClassificationMetric.MicroAccuracy)
        {
            _context = context;
            _data = data;
            _trainDataset = data.TrainSet;
            _evaluateDataset = data.TestSet;
            _labelColumnName = labelColumnName;
            _pipeline = pipeline;
            _metric = metric;
        }
    
        public void Dispose()
        {
            return;
        }
    
        // Run trial asynchronously
        public Task<TrialResult> RunAsync(TrialSettings settings, CancellationToken ct)
        {
            try
            {
                return Task.Run(() => Run(settings));
            }
            catch (Exception ex) when (ct.IsCancellationRequested)
            {
                throw new OperationCanceledException(ex.Message, ex.InnerException);
            }
            catch (Exception)
            {
                throw;
            }
        }
    
        // Helper function to define trial run logic
        private TrialResult Run(TrialSettings settings)
        {
            try
            {
                // Initialize stop watch to measure time
                var stopWatch = new Stopwatch();
                stopWatch.Start();
    
                // Get pipeline parameters
                var parameter = settings.Parameter["_pipeline_"];
    
                // Use parameters to build pipeline
                var pipeline = _pipeline.BuildFromOption(_context, parameter);
    
                // Train model
                var model = pipeline.Fit(_trainDataset);
    
                // Evaluate the model
                var predictions = model.Transform(_evaluateDataset);
    
                // Get metrics
                var evaluationMetrics = _context.MulticlassClassification.Evaluate(predictions, labelColumnName: _labelColumnName);
                var chosenMetric = GetMetric(evaluationMetrics);
    
                return new TrialResult()
                {
                    Metric = chosenMetric,
                    Model = model,
                    TrialSettings = settings,
                    DurationInMilliseconds = stopWatch.ElapsedMilliseconds
                };
            }
            catch (Exception)
            {
                return new TrialResult()
                {
                    Metric = double.MinValue,
                    Model = null,
                    TrialSettings = settings,
                    DurationInMilliseconds = 0,
                };
            }
        }
    
        // Helper function to choose metric used by experiment
        private double GetMetric(MulticlassClassificationMetrics metric)
        {
            return _metric switch
            {
                MulticlassClassificationMetric.MacroAccuracy => metric.MacroAccuracy,
                MulticlassClassificationMetric.MicroAccuracy => metric.MicroAccuracy,
                MulticlassClassificationMetric.LogLoss => metric.LogLoss,
                MulticlassClassificationMetric.LogLossReduction => metric.LogLossReduction,
                MulticlassClassificationMetric.TopKAccuracy => metric.TopKAccuracy,
                _ => throw new NotImplementedException(),
            };
        }
    }
    

    Реализация TCRunner в этом примере:

    • Извлекает гиперпараметры, выбранные для этой пробной версии
    • Использует гиперпараметров для создания конвейера ML.NET
    • Использует конвейер ML.NET для обучения модели
    • Оценка модели
    • TrialResult Возвращает объект с информацией для этой пробной версии
  4. Инициализация настраиваемого средства выполнения пробной версии

    var tcRunner = new TCRunner(context: ctx, data: trainValidationData, pipeline: pipeline);
    
  5. Создайте и настройте эксперимент. SetTrialRunner Используйте метод расширения, чтобы добавить в эксперимент настраиваемую пробную версию.

    AutoMLExperiment experiment = ctx.Auto().CreateExperiment();
    
    // Configure AutoML experiment
    experiment
        .SetPipeline(pipeline)
        .SetMulticlassClassificationMetric(MulticlassClassificationMetric.MicroAccuracy, labelColumn: columnInference.ColumnInformation.LabelColumnName)
        .SetTrainingTimeInSeconds(120)
        .SetDataset(trainValidationData)
        .SetTrialRunner(tcRunner);
    
  6. Запуск эксперимента

    var tcCts = new CancellationTokenSource();
    TrialResult textClassificationExperimentResults = await experiment.RunAsync(tcCts.Token);
    

Выбор другого настраиваемого обработчика

AutoML поддерживает различные алгоритмы настройки для итерации пространства поиска в поиске оптимальных гиперпараметров. По умолчанию используется тюнер Eci Cost Frugal. Используя методы расширения эксперимента, вы можете выбрать другой настраивающий модуль, который лучше всего подходит для вашего сценария.

Используйте следующие методы для настройки настраиваемого средства.

Например, чтобы использовать модуль поиска сетки, код может выглядеть следующим образом:

experiment.SetGridSearchTuner();

Настройка мониторинга экспериментов

Самый быстрый способ мониторинга хода выполнения эксперимента — определить Log событие из MLContext. Однако событие выводит необработанный дамп журналов, Log создаваемых AutoML во время каждой пробной версии. Из-за большого количества неформатированных сведений трудно.

Для более управляемого мониторинга реализуйте класс с интерфейсом IMonitor .

public class AutoMLMonitor : IMonitor
{
    private readonly SweepablePipeline _pipeline;

    public AutoMLMonitor(SweepablePipeline pipeline)
    {
        _pipeline = pipeline;
    }

    public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;

    public void ReportBestTrial(TrialResult result)
    {
        return;
    }

    public void ReportCompletedTrial(TrialResult result)
    {
        var trialId = result.TrialSettings.TrialId;
        var timeToTrain = result.DurationInMilliseconds;
        var pipeline = _pipeline.ToString(result.TrialSettings.Parameter);
        Console.WriteLine($"Trial {trialId} finished training in {timeToTrain}ms with pipeline {pipeline}");
    }

    public void ReportFailTrial(TrialSettings settings, Exception exception = null)
    {
        if (exception.Message.Contains("Operation was canceled."))
        {
            Console.WriteLine($"{settings.TrialId} cancelled. Time budget exceeded.");
        }
        Console.WriteLine($"{settings.TrialId} failed with exception {exception.Message}");
    }

    public void ReportRunningTrial(TrialSettings setting)
    {
        return;
    }
}

Интерфейс IMonitor имеет четыре события жизненного цикла:

Совет

Хотя это не обязательно, включите свой SweepablePipeline монитор, чтобы проверить конвейер, созданный для пробной версии, с помощью Parameter свойства объекта TrialSettings.

В этом примере реализованы только те, которые ReportCompletedTrial ReportFailTrial реализованы.

После реализации монитора настройте его как часть конфигурации эксперимента с помощью SetMonitor.

var monitor = new AutoMLMonitor(pipeline);
experiment.SetMonitor(monitor);

Затем выполните эксперимент:

var cts = new CancellationTokenSource();
TrialResult experimentResults = await experiment.RunAsync(cts.Token);

При выполнении эксперимента с этой реализацией выходные данные должны выглядеть следующим образом:

Trial 0 finished training in 5835ms with pipeline ReplaceMissingValues=>OneHotEncoding=>Concatenate=>FastForestRegression
Trial 1 finished training in 15080ms with pipeline ReplaceMissingValues=>OneHotEncoding=>Concatenate=>SdcaRegression
Trial 2 finished training in 3941ms with pipeline ReplaceMissingValues=>OneHotHashEncoding=>Concatenate=>FastTreeRegression

Сохранение пробных версий

По умолчанию AutoML сохраняет только лучшую TrialResult модель. Однако если вы хотите сохранить каждую пробную версию, это можно сделать из монитора.

Внутри монитора:

  1. Определите свойство для завершенных пробных версий и метод для доступа к ним.

    private readonly List<TrialResult> _completedTrials;
    
    public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;
    
  2. Инициализация его в конструкторе

    public AutoMLMonitor(SweepablePipeline pipeline)
    {
        //...
        _completedTrials = new List<TrialResult>();
        //...
    }
    
  3. Добавьте каждый результат пробной версии в ReportCompletedTrial метод жизненного цикла.

    public void ReportCompletedTrial(TrialResult result)
    {
        //...
        _completedTrials.Add(result);
    }
    
  4. После завершения обучения вы можете получить доступ ко всем завершенным пробным версиям, вызвав вызов GetCompletedTrials

    var completedTrials = monitor.GetCompletedTrials();
    

На этом этапе можно выполнить дополнительную обработку для сбора завершенных пробных версий. Например, можно выбрать модель, отличной от выбранной в AutoML, результаты пробной версии журнала в базу данных или перестроить конвейер из любой завершенной пробной версии.

Отмена экспериментов

При асинхронном запуске экспериментов обязательно завершите процесс. Для этого используйте .CancellationToken

Предупреждение

Отмена эксперимента не будет сохранять никакие промежуточные выходные данные. Задайте контрольную точку для сохранения промежуточных выходных данных.

var cts = new CancellationTokenSource();
TrialResult experimentResults = await experiment.RunAsync(cts.Token);

Установка контрольных точек

Контрольные точки позволяют сохранять промежуточные выходные данные из процесса обучения в случае раннего завершения или ошибки. Чтобы задать контрольную точку, используйте SetCheckpoint метод расширения и укажите каталог для хранения промежуточных выходных данных.

var checkpointPath = Path.Join(Directory.GetCurrentDirectory(), "automl");
experiment.SetCheckpoint(checkpointPath);

Определение важности признаков

Машинное обучение проникает во все аспекты нашей повседневной жизни, такие как здравоохранение, а значит, очень важно понимать, почему модель машинного обучения принимает именно те решения, которые она принимает. Важность признаков пермутации (PFI) — это метод, используемый для объяснения моделей классификации, ранжирования и регрессии. В общем смысле он случайным образом тасует весь набор данных по одному компоненту за раз и рассчитывает, на сколько снижается метрика эффективности, отражающая интерес. Чем больше изменение, тем важнее компонент. Дополнительные сведения о PFI см. в описании прогнозов моделей с помощью важности признаков пермутации.

Примечание.

Вычисление PFI может быть многократной операцией. Сколько времени требуется для вычисления, пропорционально количеству столбцов признаков, которые у вас есть. Чем больше возможностей, тем больше PFI займет выполнение.

Чтобы определить важность функций с помощью AutoML, выполните следующее:

  1. Получите лучшую модель.

    var bestModel = expResult.Model;
    
  2. Примените модель к набору данных.

    var transformedData = bestModel.Transform(trainValidationData.TrainSet);
    
  3. Вычисление важности признаков с помощью PermutationFeatureImportance

    В этом случае задача регрессия, но та же концепция применяется к другим задачам, таким как ранжирование и классификация.

    var pfiResults = 
        mlContext.Regression.PermutationFeatureImportance(bestModel, transformedData, permutationCount:3);
    
  4. Упорядочение важности признаков путем изменений в метриках оценки.

    var featureImportance = 
        pfiResults.Select(x => Tuple.Create(x.Key, x.Value.Regression.RSquared))
            .OrderByDescending(x => x.Item2);