トレーニング済みのモデルを使用して予測を行う

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

データモデルを作成する

入力データ

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され、ColumnName プロパティのPredictedPrice属性によって定義されます。

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

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

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

Important

信頼できるソースからのみモデルを読み込みます。 信頼されていないソースからモデルを読み込むと、セキュリティ上のリスクがあります。

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

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

単一の予測

単一の予測を行うには、読み込まれた予測パイプラインを使用して 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);

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

ヒント

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

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

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

複数の予測 (IDataView)

次のデータを IDataView にロードします。 この場合、 IDataView の名前は inputDataCurrentPriceは、新しいデータを使用して予測しようとしているターゲットまたはラベルであるため、現時点では値がないと想定されています。

// 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();

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

観察 Prediction
1 144638.2
2 150079.4
3 107789.8

複数の予測 (PredictionEnginePool)

PredictionEnginePool を使用して複数の予測を行うには、モデル入力の複数のインスタンスを含むIEnumerableを取得できます。 たとえば、IEnumerable<HousingInput>を取得し、LINQ Predict メソッドを使用して各要素にSelect メソッドを適用します。

このコード サンプルでは、 と呼ばれる predictionEnginePool と、IEnumerable<HousingData> というhousingDataがあることを前提としています。

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

結果は、予測のインスタンスを含む IEnumerable になります。 この場合は、 IEnumerable<HousingPrediction>