クロス検証を使って機械学習モデルをトレーニングする
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 回操作を適用されるので、パイプライン内の後続の操作が最適化されます。
列が 1 つのベクターに結合されると、NormalizeMinMax
が Features
列に適用され、0 - 1 という同じ範囲の Size
と HistoricalPrices
が得られます。
// 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
メソッドを使用します。
注意
このサンプルでは線形回帰モデルを使用しますが、CrossValidate は、異常検出を除く ML.NET の他のすべての機械学習タスクに適用できます。
// 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
によって次の操作が実行されます。
numberOfFolds
パラメーターに指定された値と等しい数のパーティションにデータを分割します。 各パーティションの結果はTrainTestData
オブジェクトです。- 各パーティションでは、トレーニング データ セットに対して指定した機械学習アルゴリズム エスティメーターを使用してモデルがトレーニングされます。
- 各モデルのパフォーマンスは、テスト データ セットに対して
Evaluate
メソッドを使用して評価されます。 - 各モデルについて、モデルとそのメトリックが返されます。
cvResults
に格納される結果は、CrossValidationResult
オブジェクトのコレクションです。 このオブジェクトには、トレーニング済みモデルだけでなく、Model
プロパティと Metrics
プロパティの両方からそれぞれアクセスできるメトリックが含まれています。 このサンプルでは、Model
プロパティは ITransformer
型であり、Metrics
プロパティは RegressionMetrics
型です。
モデルを評価する
個々の CrossValidationResult
オブジェクトの Metrics
プロパティを介してさまざまなトレーニング済みモデルのメトリックにアクセスできます。 この場合は、R-2 乗メトリックにアクセスし、変数 rSquared
に格納されます。
IEnumerable<double> rSquared =
cvResults
.Select(fold => fold.Metrics.RSquared);
rSquared
変数の内容を調べると、出力は 0 - 1 の範囲の 5 つの値になります (1 に近いほど適しています)。 R-2 乗などのメトリックを使用して、最適なパフォーマンスから最低のパフォーマンスのモデルを選択します。 次に、最上位のモデルを選択して予測を行うか、追加の操作を実行します。
// Select all models
ITransformer[] models =
cvResults
.OrderByDescending(fold => fold.Metrics.RSquared)
.Select(fold => fold.Model)
.ToArray();
// Get Top Model
ITransformer topModel = models[0];
.NET