トレーニング済みモデルを使用して予測する

トレーニング済みモデルを使用して予測する方法について説明します

データモデルを作成する

入力データ

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

出力データ

FeaturesLabel の入力列名と同様に、ML.NET にはモデルによって生成される予測値列の既定の名前があります。 タスクによっては名前が異なる場合があります。

このサンプルで使用されているアルゴリズムは線形回帰アルゴリズムなので、出力列の既定の名前は Score です。これは PredictedPrice プロパティの ColumnName 属性によって定義されます。

class HousingPrediction
{
    [ColumnName("Score")]
    public float PredictedPrice { get; set; }
}

予測パイプラインを設定する

1 つの予測でもバッチ予測でも、予測パイプラインをアプリケーションに読み込む必要があります。 このパイプラインには、データの前処理変換とトレーニング済みモデルの両方が含まれています。 次のコード スニペットは、model.zip という名前のファイルから予測パイプラインを読み込みます。

//Create MLContext
MLContext mlContext = new MLContext();

// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

1 つの予測

1 つの予測を行うには、読み込まれた予測パイプラインを使用して PredictionEngine を作成します。

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);

次に、Predict メソッドを使用して、入力データをパラメーターとして渡します。 Predict メソッドを使用する場合、入力が IDataView である必要はない点に注意してください。 これは、入力データ型のオブジェクトを渡すことができるように、入力データ型の操作を簡単に内部化できるためです。 さらに、CurrentPrice は新しいデータを使用して予測しようとしているターゲットまたはラベルなので、この時点では値がないと見なされます。

// Input Data
HousingData inputData = new HousingData
{
    Size = 900f,
    HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);

prediction オブジェクトの Score プロパティにアクセスすると、150079 のような値になります。

ヒント

PredictionEngine はスレッド セーフではありません。 さらに、アプリケーション内で必要なすべての場所にそのインスタンスを作成する必要があります。 アプリケーションの規模が拡大すると、このプロセスが管理不能になる可能性があります。 パフォーマンスとスレッド セーフを向上させるには、依存性の挿入と PredictionEnginePool サービスを組み合わせて使用します。これにより、アプリケーション全体で使用する PredictionEngine オブジェクトの ObjectPool が作成されます。

PredictionEnginePool サービスの使用方法例については、Web API にモデルをデプロイする方法に関するページと「Azure Functions にモデルをデプロイする」を参照してください。

詳細については、「ASP.NET Core での依存関係の挿入」を参照してください。

複数の予測 (IDataView)

次のデータがあるとして、IDataView に読み込みます。 この場合、IDataView の名前は inputData です。 CurrentPrice は新しいデータを使用して予測しようとしているターゲットまたはラベルなので、この時点では値がないと見なされます。

// Actual data
HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f, 175000f, 210000f }
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f }
    }
};

次に、Transform メソッドを使用してデータ変換を適用し、予測を生成します。

// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);

GetColumn メソッドを使用して予測値を調べます。

// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();

スコア列の予測値は次のようになります。

監視 予測
1 144638.2
2 150079.4
3 107789.8

複数の予測 (PredictionEnginePool)

PredictionEnginePool を利用して複数の予測を行う目的で、モデル入力のインスタンスが複数含まれる IEnumerable を受け取ることができます。 たとえば、IEnumerable<HousingInput> を受け取り、LINQ の Select メソッドを利用して各要素に Predict メソッドを適用します。

このコード サンプルでは、predictionEnginePool という名称の PredictionEnginePoolhousingData という名称の IEnumerable<HousingData> が想定されています。

IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));

この結果は予測のインスタンスが含まれる IEnumerable です。 この例では、IEnumerable<HousingPrediction> になります。