다음을 통해 공유


ML.NET AutoML(자동화된 Machine Learning) API를 사용하는 방법

이 문서에서는 ML.NET 자동화된 ML(AutoML API)을 사용하는 방법을 알아봅니다.

AutoML API 샘플은 dotnet/machinelearning-samples 리포지토리에서 찾을 수 있습니다.

설치

AutoML API를 사용하려면 참조하려는 .NET 프로젝트에 Microsoft.ML.AutoML NuGet 패키지를 설치합니다.

참고 항목

이 가이드에서는 Microsoft.ML.AutoML NuGet 패키지 버전 0.20.0 이상을 사용합니다. 이전 버전의 샘플과 코드는 여전히 작동하지만 새 프로젝트에는 이 버전에 도입된 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 환경이 만들어집니다. 개념적으로 Entity Framework의 DBContext와 유사합니다.

그런 다음 데이터를 로드하려면 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는 데이터 세트에서 몇 개의 행을 로드합니다. 그런 다음 데이터를 검사하고 해당 콘텐츠를 기반으로 각 열의 데이터 형식을 추측하거나 유추하려고 합니다.

기본 동작은 동일한 형식의 열을 각 개별 열의 요소를 포함하는 기능 벡터 또는 배열로 그룹화하는 것입니다. groupColumnsfalse로 설정하면 기본 동작이 재정의되고 열을 그룹화하지 않고 열 유추만 수행됩니다. 열을 별도로 유지하면 열 그룹화가 아닌 개별 열 수준에서 데이터를 전처리할 때 다양한 데이터 변환을 적용할 수 있습니다.

InferColumns의 결과는 TextLoader를 만드는 데 필요한 옵션과 열 정보를 포함하는 ColumnInferenceResults 개체입니다.

taxi-fare-train.csv에 있는 샘플 데이터 세트의 경우 열 정보는 다음과 같습니다.

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

열 정보가 있으면 ColumnInferenceResults에서 정의한 TextLoader.Options를 사용하여 TextLoader를 만들어 데이터를 IDataView에 로드합니다.

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

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

데이터를 학습 집합과 유효성 검사 집합으로 분할하는 것이 좋은 방법인 경우가 많습니다. 데이터 세트의 학습 80%와 유효성 검사 20% 분할을 만들려면 TrainTestSplit을 사용합니다.

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

SweepablePipelineSweepableEstimator의 컬렉션입니다. SweepableEstimatorSearchSpace가 포함된 ML.NET Estimator입니다.

Featurizer는 제공한 열 정보를 기반으로 정리 가능한 데이터 처리 예측 도구의 정리 가능한 파이프라인을 빌드하는 편리한 API입니다. 파이프라인을 처음부터 빌드하는 대신 Featurizer는 데이터 전처리 단계를 자동화합니다. ML.NET에서 지원되는 변환에 대한 자세한 내용은 데이터 변환 가이드를 참조하세요.

Featurizer 출력은 각 열의 변환된 데이터를 나타내는 숫자 기능 벡터를 포함하는 단일 열입니다. 그런 다음 이 기능 벡터는 기계 학습 모델을 학습하는 데 사용되는 알고리즘의 입력으로 사용됩니다.

데이터 전처리를 보다 세밀하게 제어하려면 각 개별 전처리 단계로 파이프라인을 만들 수 있습니다. 자세한 내용은 모델 빌드를 위한 데이터 준비 가이드를 참조하세요.

AutoML의 유용성을 최대화하려면 FeaturizerColumnInferenceResults와 함께 사용합니다.

학습을 위해 AutoML은 다음 기계 학습 작업을 위한 기본 트레이너 및 검색 공간 구성을 갖춘 정리 가능한 파이프라인을 제공합니다.

택시 요금 예측 문제의 경우 숫자 값을 예측하는 것이 목표이므로 Regression을 사용합니다. 작업 선택에 대한 자세한 내용은 ML.NET의 기계 학습 작업을 참조하세요.

실험 구성

먼저 AutoML 실험을 만듭니다. AutoMLExperimentTrialResult의 컬렉션입니다.

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

실험이 만들어지면 실험이 제공하는 확장 방법을 사용하여 다양한 설정을 구성합니다.

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

이 예에서는 다음을 수행합니다.

  • SetPipeline을 호출하여 실험 중에 실행할 정리 가능한 파이프라인을 설정합니다.
  • SetRegressionMetric을 호출하여 학습 중에 최적화할 메트릭으로 RSquared를 선택합니다. 평가 메트릭에 대한 자세한 내용은 메트릭을 사용하여 ML.NET 모델 평가 가이드를 참조하세요.
  • SetTrainingTimeInSeconds를 호출하여 학습하려는 시간을 60초로 설정합니다. 학습 기간을 결정하는 좋은 휴리스틱은 데이터 크기입니다. 일반적으로 데이터 세트가 클수록 학습 시간이 더 길어집니다. 자세한 내용은 학습 시간 지침를 참조하세요.
  • SetDataset를 호출하여 사용할 학습 및 유효성 검사 데이터 세트를 제공합니다.

실험이 정의되면 진행률을 추적할 수 있는 방법이 필요할 것입니다. 진행률을 추적하는 가장 빠른 방법은 MLContext에서 Log 이벤트를 수정하는 것입니다.

// 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를 호출하면 CategoricalColumnNames 대신 NumericColumnNames 속성에 rate_code가 배치됩니다. 이러한 속성은 .NET 컬렉션이므로 표준 작업을 사용하여 항목을 추가하고 제거할 수 있습니다.

다음을 수행하여 rate_code에 대한 ColumnInformation을 업데이트할 수 있습니다.

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를 만들기 위한 사용자 지정 팩터리 메서드를 정의합니다. 이 예에서 L1RegularizationL2Regularization의 값은 모두 기본값이 아닌 다른 값으로 설정됩니다. 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;

검색 범위를 사용자 지정하는 또 다른 옵션은 검색 범위를 확장하는 것입니다. 예를 들어, SdcaOptionL1RegularizationL2Regularization 매개 변수만 제공합니다. 그러나 SdcaRegressionTrainer에는 BiasLearningRate와 같이 설정할 수 있는 더 많은 매개 변수가 있습니다.

검색 공간을 확장하려면 SdcaOption에서 상속되는 SdcaExtendedOption과 같은 새 클래스를 만듭니다.

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

검색 공간 범위를 지정하려면 Microsoft.ML.SearchSpace.Option과 동등한 RangeAttribute를 사용합니다.

그런 다음 검색 공간을 사용하는 모든 곳에서 SdcaOption 대신 SdcaExtendedOption을 참조하세요.

예를 들어, 검색 공간을 초기화할 때 다음과 같이 수행할 수 있습니다.

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. 사용자 지정 체험 실행기 만들기

    사용자 지정 체험 실행기를 만들려면 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 비용 절약 튜너를 사용합니다. 실험 확장 방법을 사용하면 시나리오에 가장 적합한 다른 튜너를 선택할 수 있습니다.

튜너를 설정하려면 다음 방법을 사용합니다.

예를 들어, 그리드 검색 튜너를 사용하려면 코드가 다음과 같을 수 있습니다.

experiment.SetGridSearchTuner();

실험 모니터링 구성

실험 진행률을 모니터링하는 가장 빠른 방법은 MLContext에서 Log 이벤트를 정의하는 것입니다. 그러나 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 인터페이스에는 네 가지 수명 주기 이벤트가 있습니다.

필수는 아니지만 TrialSettingsParameter 속성을 사용하여 체험용으로 생성된 파이프라인을 검사할 수 있도록 모니터에 SweepablePipeline을 포함합니다.

이 예에서는 ReportCompletedTrialReportFailTrial만 구현됩니다.

모니터를 구현한 후에는 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을 사용합니다.

Warning

실험을 취소하면 중간 결과가 저장되지 않습니다. 중간 출력을 저장하려면 검사점을 설정합니다.

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