次の方法で共有


クロス検証を使用して機械学習モデルをトレーニングする

クロス検証を使用して、ML.NET でより堅牢な機械学習モデルをトレーニングする方法について説明します。

クロス検証は、データを複数のパーティションに分割し、これらのパーティションで複数のアルゴリズムをトレーニングするトレーニングおよびモデル評価手法です。 この手法では、トレーニング プロセスからデータを保持することで、モデルの堅牢性が向上します。 データが制約された環境では、見えない観察のパフォーマンスが向上するだけでなく、データセットが小さいモデルをトレーニングするための効果的なツールになる可能性があります。

データとデータ モデル

次の形式のファイルからのデータを指定します。

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
620.00, 148330.32, 140913.81, 136686.39, 146105.37
550.00, 557033.46, 529181.78, 513306.33, 548677.95
1127.00, 479320.99, 455354.94, 441694.30, 472131.18
1120.00, 47504.98, 45129.73, 43775.84, 46792.41

データは、HousingData などのクラスによってモデル化され、IDataViewに読み込むことができます。

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

データを準備する

データを使用して機械学習モデルを構築する前に、事前に処理します。 このサンプルでは、Size 列と HistoricalPrices 列が 1 つの特徴ベクトルに結合され、Concatenate メソッドを使用して Features という新しい列に出力されます。 ML.NET アルゴリズムで想定される形式にデータを取得するだけでなく、列を連結すると、各列ではなく連結列に対して 1 回だけ操作を適用することで、パイプライン内の後続の操作が最適化されます。

列を単一のベクターに結合すると、NormalizeMinMaxFeatures 列に適用され、Size および HistoricalPrices が 0 から 1 の範囲内で得られます。

// Define data prep estimator
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);

// Transform data
IDataView transformedData = dataPrepTransformer.Transform(data);

クロス検証を使用してモデルをトレーニングする

データが前処理されたら、モデルをトレーニングします。 まず、実行する機械学習タスクに最も近いアルゴリズムを選択します。 予測値は数値連続値であるため、タスクは回帰です。 ML.NET によって実装される回帰アルゴリズムの 1 つは、StochasticDualCoordinateAscentCoordinator アルゴリズムです。 クロス検証を使用してモデルをトレーニングするには、CrossValidate メソッドを使用します。

手記

このサンプルでは線形回帰モデルを使用していますが、異常検出を除く ML.NET の他のすべての機械学習タスクに CrossValidate を適用できます。

// Define StochasticDualCoordinateAscent algorithm estimator
IEstimator<ITransformer> sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Apply 5-fold cross validation
var cvResults = mlContext.Regression.CrossValidate(transformedData, sdcaEstimator, numberOfFolds: 5);

CrossValidate は、次の操作を実行します。

  1. numberOfFolds パラメーターで指定された値と同じ数のパーティションにデータをパーティション分割します。 各パーティションの結果は、TrainTestData オブジェクトです。
  2. モデルは、トレーニング データ セットで指定された機械学習アルゴリズム推定器を使用して、各パーティションでトレーニングされます。
  3. 各モデルのパフォーマンスは、テスト データ セットの Evaluate メソッドを使用して評価されます。
  4. モデルとそのメトリックは、各モデルに対して返されます。

cvResults に格納された結果は、CrossValidationResult オブジェクトのコレクションです。 このオブジェクトには、トレーニング済みのモデルと、Model プロパティと Metrics プロパティの両方からアクセス可能なメトリックが含まれます。 このサンプルでは、Model プロパティは ITransformer 型で、Metrics プロパティは RegressionMetrics型です。

モデルを評価する

さまざまなトレーニング済みモデルのメトリックには、個々の CrossValidationResult オブジェクトの Metrics プロパティを使用してアクセスできます。 この場合、R-Squared メトリック にアクセスし、変数 rSquaredに格納します。

IEnumerable<double> rSquared =
    cvResults
        .Select(fold => fold.Metrics.RSquared);

rSquared 変数の内容を調べる場合、出力は 0 から 1 までの範囲の 5 つの値で、1 に近いほど最適です。 R-Squared などのメトリックを使用して、最適なパフォーマンスから最悪のパフォーマンスのモデルを選択します。 次に、予測を行うか、追加の操作を実行する上位モデルを選択します。

// Select all models
ITransformer[] models =
    cvResults
        .OrderByDescending(fold => fold.Metrics.RSquared)
        .Select(fold => fold.Model)
        .ToArray();

// Get Top Model
ITransformer topModel = models[0];