Inspekcja danych pośrednich podczas przetwarzania
Dowiedz się, jak sprawdzać dane pośrednie podczas ładowania, przetwarzania i trenowania modelu w ML.NET. Dane pośrednie to dane wyjściowe każdego etapu w potoku uczenia maszynowego.
Weź pod uwagę następujące dane mieszkaniowe:
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
}
};
W ML.NET można sprawdzić dane pośrednie, takie jak te załadowane do IDataView
na różne sposoby, zgodnie z opisem w poniższych sekcjach.
Konwertowanie elementu IDataView na element IEnumerable
Jednym z najszybszych sposobów inspekcji obiektu IDataView
jest przekonwertowanie go na IEnumerable
element . Aby wykonać tę konwersję, użyj metody CreateEnumerable
.
Aby zoptymalizować wydajność, ustaw wartość reuseRowObject
true
. W ten sposób leniwie wypełnia ten sam obiekt danymi bieżącego wiersza, w przeciwieństwie do tworzenia nowego obiektu dla każdego wiersza w zestawie danych.
// 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);
}
Uzyskiwanie dostępu do określonych indeksów za pomocą funkcji IEnumerable
Jeśli potrzebujesz dostępu tylko do części danych lub określonych indeksów, użyj CreateEnumerable
i ustaw wartość parametru reuseRowObject
na false
, aby nowy obiekt został utworzony dla każdego żądanego wiersza w zestawie danych. Następnie przekonwertuj IEnumerable
obiekt na tablicę lub listę.
Ostrzeżenie
Konwertowanie wyniku CreateEnumerable
na tablicę lub listę ładuje wszystkie żądane wiersze IDataView
do pamięci, co może mieć wpływ na wydajność.
Po utworzeniu kolekcji można wykonywać operacje na danych. Poniższy fragment kodu pobiera pierwsze trzy wiersze w zestawie danych i oblicza średnią bieżącą cenę.
// 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;
Sprawdzanie wartości w jednej kolumnie
W dowolnym momencie procesu tworzenia modelu można uzyskać dostęp do wartości w jednej kolumnie obiektu IDataView
przy użyciu GetColumn
metody . Metoda GetColumn
zwraca wszystkie wartości w jednej kolumnie jako IEnumerable
.
IEnumerable<float> sizeColumn = data.GetColumn<float>("Size").ToList();
Sprawdzanie wartości IDataView po jednym wierszu jednocześnie
IDataView
jest oceniana leniwie. Aby iterować wiersze elementu IDataView
bez konwersji na element IEnumerable
, jak pokazano w poprzednich sekcjach tego dokumentu, utwórz obiekt DataViewRowCursor
przy użyciu GetRowCursor
metody i przekazując element DataViewSchema elementu IDataView
jako parametr. Następnie, aby iterować wiersze, użyj MoveNext
metody kursora wraz z ValueGetter
delegatami, aby wyodrębnić odpowiednie wartości z każdej z kolumn.
Ważne
W celach wydajności wektory w ML.NET używają VBuffer
zamiast natywnych typów kolekcji (czyli Vector
i float[]
).
// 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);
}
}
Podgląd wyniku wstępnego przetwarzania lub uczenia na podzbiorze danych
Ostrzeżenie
Nie używaj Preview
kodu produkcyjnego, ponieważ jest przeznaczony do debugowania i może zmniejszyć wydajność.
Proces tworzenia modelu jest eksperymentalny i iteracyjny. Aby wyświetlić podgląd, jak dane będą wyglądać po zastosowaniu wstępnego przetwarzania lub trenowaniu modelu uczenia maszynowego na podzbiorze danych, użyj metody Preview
, która zwraca DataDebuggerPreview
. Wynikiem jest obiekt z właściwościami ColumnView
i RowView
, które są zarówno IEnumerable
, jak i zawierają wartości w określonej kolumnie lub wierszu. Określ liczbę wierszy, do których ma być stosowane przekształcenie za pomocą parametru maxRows
.
Wynik inspekcji IDataView
jest podobny do poniższego rysunku.