ML.NET Automated Machine Learning (AutoML) API を使用する方法

この記事では、ML.NET Automated 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);

多くの場合、データをトレーニング セットと検証セットに分割することをお勧めします。 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));

SweepablePipeline は、SweepableEstimator のコレクションです。 SweepableEstimator は、SearchSpace を持つ 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 を呼び出すと、NumericColumnNamesプロパティには CategoricalColumnNames ではなく rate_code が配置されます。 これらのプロパティは .NET コレクションであるため、標準操作を使用して項目を追加および削除できます。

rate_codeColumnInformation を更新するには、次の操作を行います。

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;

探索範囲をカスタマイズするもう 1 つのオプションは、探索範囲を拡張することです。 たとえば、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 と同じです。

そして、探索空間を使用する任意の箇所で、SdcaOption の代わりに SdcaExtendedOption を参照するようにします。

たとえば、探索空間を初期化する場合は、次のように行うことができます。

var sdcaSearchSpace = new SearchSpace<SdcaExtendedOption>();

独自の試行ランナーを作成する

既定では、AutoML では二項分類、多クラス分類、回帰がサポートされています。 しかし、ML.NET では、以下のような、より多くのシナリオがサポートされています。

  • 推奨
  • 予測
  • ランキング
  • 画像の分類
  • テキスト分類
  • 文の類似性

事前構成済みの探索空間とスイープ可能な推定器がないシナリオでは、独自のものを作成し試行ランナーを使用して、そのシナリオに対して AutoML を有効にすることができます。

たとえば、次のようなレストラン レビューのデータを与えられたとします。

Wow...Loved this place.

1

Crust is not good.

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 Cost Frugal チューナーが使用されます。 実験拡張メソッドを使用すると、シナリオに最適な別のチューナーを選択できます。

チューナーを設定するには、次のメソッドを使用します。

たとえば、グリッド探索チューナーを使用する場合、コードは次のようになります。

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 インターフェイスには、次の4 つのライフサイクル イベントがあります。

ヒント

必須ではありませんが、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 を使用します。

警告

実験を取り消しても、中間出力は保存されません。 中間出力を保存するにはチェックポイントを設定します。

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

チェックポイントを設定する

チェックポイントは、早期終了やエラーが発生した場合にトレーニング プロセスからの中間出力を保存する方法を提供します。 チェックポイントを設定するには、SetCheckpoint 拡張メソッドを使用し、中間出力を格納するディレクトリを指定します。

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

特徴量の重要度を決定する

医療など、日常生活の多くの側面に機械学習が導入されるにつれて、機械学習モデルが決定を下す理由を理解することの重要度が最も高くなりました。 順列の特徴量の重要度 (PFI) は、分類、優先度付け、回帰モデルを説明するために使用される手法です。 概要を説明すると、データセット全体に対して一度に 1 つの特徴のデータをランダムにシャッフルし、関心のあるパフォーマンス メトリックがどのくらい低下するかを計算するしくみです。 変更が大きいほど、その特徴の重要度は高くなります。 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);