クロス検証を使用して機械学習モデルをトレーニングする
クロス検証を使用して、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 回だけ操作を適用することで、パイプライン内の後続の操作が最適化されます。
列を単一のベクターに結合すると、NormalizeMinMax
が Features
列に適用され、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
は、次の操作を実行します。
numberOfFolds
パラメーターで指定された値と同じ数のパーティションにデータをパーティション分割します。 各パーティションの結果は、TrainTestData
オブジェクトです。- モデルは、トレーニング データ セットで指定された機械学習アルゴリズム推定器を使用して、各パーティションでトレーニングされます。
- 各モデルのパフォーマンスは、テスト データ セットの
Evaluate
メソッドを使用して評価されます。 - モデルとそのメトリックは、各モデルに対して返されます。
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];
.NET