Поделиться через


Проверка промежуточных данных при обработке

Сведения о проверке промежуточных данных при загрузке, обработке и обучении модели в 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 будет похож на приведенный ниже.

Представление строки предварительного просмотра отладчика данных