処理中に中間データを検査する

読み込み中、処理中に中間データを検査する方法と、ML.NET のモデル トレーニング手順について説明します。 中間データは機械学習パイプラインの各ステージの出力です。

IDataView に読み込まれる以下に示すような中間データは、ML.NET においてさまざまな方法で検査できます。

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    },
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

IDataView を IEnumerable に変換する

IDataView を検査する最も簡単な方法の 1 つは、IEnumerable に変換することです。 IDataViewIEnumerable に変換するには、CreateEnumerable メソッドを使用します。

パフォーマンスを最適化するには、reuseRowObjecttrue に設定します。 これにより、同一オブジェクトには現在の行のデータが遅れて設定され、データセット内の行ごとに新しいオブジェクトを作成する場合とは対照的に評価されます。

// Create an IEnumerable of HousingData objects from IDataView
IEnumerable<HousingData> housingDataEnumerable =
    mlContext.Data.CreateEnumerable<HousingData>(data, reuseRowObject: true);

// Iterate over each row
foreach (HousingData row in housingDataEnumerable)
{
    // Do something (print out Size property) with current Housing Data object being evaluated
    Console.WriteLine(row.Size);
}

IEnumerable を使用して特定のインデックスにアクセスする

データの一部や特定のインデックスにしかアクセスする必要がない場合は、データセット内の要求された各行に対して新しいオブジェクトが作成されるように、CreateEnumerable を使用すると共に reuseRowObject パラメータ―の値を false に設定します。 その後、IEnumerable を配列またはリストに変換します。

警告

CreateEnumerable の結果を配列またはリストに変換すると、要求されたすべての IDataView 行がメモリに読み込まれ、パフォーマンスに影響を及ぼす可能性があります。

コレクションが作成されたら、データに対する操作を実行できます。 以下のコード スニペットでは、データセット内の最初の 3 つの行を取得して、現在の平均価格を計算します。

// Create an Array of HousingData objects from IDataView
HousingData[] housingDataArray =
    mlContext.Data.CreateEnumerable<HousingData>(data, reuseRowObject: false)
        .Take(3)
        .ToArray();

// Calculate Average CurrentPrice of First Three Elements
HousingData firstRow = housingDataArray[0];
HousingData secondRow = housingDataArray[1];
HousingData thirdRow = housingDataArray[2];
float averageCurrentPrice = (firstRow.CurrentPrice + secondRow.CurrentPrice + thirdRow.CurrentPrice) / 3;

単一列内の値を検査する

モデル構築プロセスの任意の時点で、IDataView の単一列内の値には GetColumn メソッドを使用してアクセスできます。 GetColumn メソッドは、単一列内のすべての値を IEnumerable として返します。

IEnumerable<float> sizeColumn = data.GetColumn<float>("Size").ToList();

IDataView の値を 1 行ずつ検査する

IDataView は遅れて評価されます。 このドキュメントの前のセクションで示したように、IEnumerable に変換せずに IDataView の複数の行にわたって反復処理を行うには、GetRowCursor メソッドを使用して IDataViewDataViewSchema をパラメーターとして渡すことで、DataViewRowCursor を作成します。 その後、複数の行にわたって反復処理を行うために、MoveNext カーソル メソッドを ValueGetter デリゲートと共に使用して、各列からそれぞれの値を抽出します。

重要

パフォーマンスのために、ML.NET 内のベクターには、ネイティブなコレクション型 (つまり、Vectorfloat[]) ではなく、VBuffer を使用します。

// Get DataViewSchema of IDataView
DataViewSchema columns = data.Schema;

// Create DataViewCursor
using (DataViewRowCursor cursor = data.GetRowCursor(columns))
{
    // Define variables where extracted values will be stored to
    float size = default;
    VBuffer<float> historicalPrices = default;
    float currentPrice = default;

    // Define delegates for extracting values from columns
    ValueGetter<float> sizeDelegate = cursor.GetGetter<float>(columns[0]);
    ValueGetter<VBuffer<float>> historicalPriceDelegate = cursor.GetGetter<VBuffer<float>>(columns[1]);
    ValueGetter<float> currentPriceDelegate = cursor.GetGetter<float>(columns[2]);

    // Iterate over each row
    while (cursor.MoveNext())
    {
        //Get values from respective columns
        sizeDelegate.Invoke(ref size);
        historicalPriceDelegate.Invoke(ref historicalPrices);
        currentPriceDelegate.Invoke(ref currentPrice);
    }
}

データのサブセットに対する前処理またはトレーニングの結果をプレビューする

警告

Preview はデバッグを目的としており、パフォーマンスを低下させる可能性があるため、実稼働環境のコードでは使用しないでください。

モデルのビルド プロセスは実験的であり、反復されます。 データのサブセットに対して機械学習モデルの前処理またはトレーニングを行った後にデータがどうなってるかをプレビューするには、DataDebuggerPreview を返す Preview メソッドを使用します。 結果のオブジェクトは ColumnView および RowView プロパティを含み、どちらも IEnumerable になっていて、特定の列または行の値が格納されています。 maxRows パラメータ―を使って、変換を適用する行数を指定します。

Data Debugger Preview Object

IDataView を検査した結果は、次のようになります。

Data Debugger Preview Row View