Проверка промежуточных данных при обработке
Сведения о проверке промежуточных данных при загрузке, обработке и обучении модели в 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
является преобразование в 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
в память, что может негативно повлиять на производительность.
После создания коллекции можно выполнить операции с данными. Приведенный ниже фрагмент кода принимает первые три строки в наборе данных и вычисляет среднюю текущую стоимость.
// 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 по одной строке за раз
IDataView
вычисляется в отложенном режиме. Для выполнения итераций по строкам IDataView
без преобразования в IEnumerable
, как показано в предыдущих разделах этого документа, создайте DataViewRowCursor
, используя метод GetRowCursor
и передав DataViewSchema интерфейса IDataView
в качестве параметра. Затем для выполнения итерации по строкам используйте метод курсора MoveNext
вместе с делегатами ValueGetter
, чтобы извлечь соответствующие значения из каждого столбца.
Внимание
В целях производительности векторы в ML.NET используют VBuffer
вместо собственных типов коллекций (то есть Vector
, ). 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);
}
}
Просмотр результата предварительной обработки или обучения с использованием подмножества данных
Предупреждение
Не используйте Preview
в рабочем коде, потому что он предназначен для отладки и может снизить производительность.
Процесс создания модели является экспериментальным и итеративным. Чтобы просмотреть данные после предварительной обработки или обучения модели машинного обучения на подмножестве данных, используйте метод Preview
, возвращающий DataDebuggerPreview
. Результат представляет собой объект со свойствами ColumnView
и RowView
, которые являются IEnumerable
и содержат значения в определенном столбце или строке. Укажите число строк, к которым применяется преобразование, с помощью параметра maxRows
.
Результат проверки IDataView
будет похож на приведенный ниже.