処理中に中間データを検査する
読み込み中、処理中に中間データを検査する方法と、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
に変換することです。 IDataView
を IEnumerable
に変換するには、CreateEnumerable
メソッドを使用します。
パフォーマンスを最適化するには、reuseRowObject
を true
に設定します。 これにより、同一オブジェクトには現在の行のデータが遅れて設定され、データセット内の行ごとに新しいオブジェクトを作成する場合とは対照的に評価されます。
// 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
メソッドを使用して IDataView
の DataViewSchema をパラメーターとして渡すことで、DataViewRowCursor
を作成します。 その後、複数の行にわたって反復処理を行うために、MoveNext
カーソル メソッドを ValueGetter
デリゲートと共に使用して、各列からそれぞれの値を抽出します。
重要
パフォーマンス上の理由から、ML.NET のベクターでは、ネイティブ コレクション型 (つまり、Vector
、float[]
) の代わりに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
パラメータ―を使って、変換を適用する行数を指定します。
IDataView
を検査した結果は、次のようになります。
.NET