Обучение и оценка модели

Из этой статьи вы узнаете, как создавать модели машинного обучения, собирать метрики и измерять производительность с помощью ML.NET. Несмотря на то что код в этом примере обучает модель регрессии, те же принципы действуют и в большинстве других алгоритмов.

Разделение данных на обучающий и проверочный наборы

Цель модели машинного обучения — обнаружить закономерности в обучающих данных. Эти закономерности используются для создания прогнозов на основе новых данных.

Можно моделировать данные с помощью класса, например HousingData.

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

Используйте следующие данные, которые загружаются в IDataView.

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
    }
};

Разделите данные на обучающий и проверочный наборы с помощью метода TrainTestSplit. В результате появится объект TrainTestData, содержащий два члена IDataView — один для обучающего набора данных, другой для проверочного. Распределение данных определяется параметром testFraction. В приведенном ниже фрагменте кода для проверочного набора удерживаются 20 процентов исходных данных.

DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;

Подготовка данных

Перед обучением модели машинного обучения данные необходимо подвергнуть предварительной обработке. Дополнительные сведения о подготовке данных см. в инструкции по подготовке данных, а также в transforms page.

Алгоритмы ML.NET имеют ограничения на типы входных столбцов. Кроме того, если значения не указаны, в качестве имен входных и выходных столбцов используются значения по умолчанию.

Работа с ожидаемыми типами столбцов

Алгоритмы машинного обучения в ML.NET в качестве входных данных ожидают вектор с плавающей запятой известного размера. Если все данные уже переведены в числовой формат и предназначены для одновременной обработки (пиксели изображения), примените к модели данных атрибут VectorType.

Если не все данные являются числовыми, а вы хотите к каждому столбцу применить отдельное преобразование данных, используйте метод Concatenate после обработки каждого столбца — в результате все отдельные столбцы будут объединены в единый вектор компонентов, который будет выходными данными нового столбца.

В следующем фрагменте кода столбцы Size и HistoricalPrices объединены в один вектор компонентов, который служит выходными данными для нового столбца с именем Features. Поскольку нет разницы в масштабах, NormalizeMinMax применяется к столбцу Features для нормализации данных.

// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);

// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);

Работа с именами столбцов по умолчанию

Если имена столбцов не указаны, алгоритмы ML.NET используют имена по умолчанию. Все инструкторы имеют параметр с именем featureColumnName для входных данных, алгоритма, а там, где это применимо, еще и параметр с именем labelColumnName для ожидаемого значения. По умолчанию используются значения Features и Label соответственно.

Если во время предварительной обработки используется метод Concatenate, который создает столбец с именем Features, имя столбца компонентов в параметрах алгоритма указывать необязательно, поскольку он уже существует в предварительно обработанных данных IDataView. Столбец меток — CurrentPrice, но в связи с тем, что атрибут ColumnName используется в модели данных, ML.NET переименовывает столбец CurrentPrice в Label и таким образом устраняет необходимость предоставлять параметр labelColumnName для средства оценки алгоритма машинного обучения.

Если вы не хотите использовать имена столбцов по умолчанию, передайте имена столбцов компонентов и меток в виде параметров при определении средства оценки алгоритма машинного обучения, как показано в следующем фрагменте кода:

var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");

Кэширование данных

По умолчанию при обработке данных их загрузка или потоковая передача осуществляется отложенным образом. Это означает, что во время обучения алгоритмы обучения могут несколько раз загружать данные с диска и выполнять их итерацию. Поэтому чтобы сократить количество загрузок данных с диска, рекомендуется кэшировать помещаемые в память наборы данных. Кэширование выполняется как часть EstimatorChain с помощью AppendCacheCheckpoint.

Рекомендуется использовать AppendCacheCheckpoint до алгоритмов обучения в конвейере.

Используя следующий класс EstimatorChain для добавления метода AppendCacheCheckpoint перед классом StochasticDualCoordinateAscent, алгоритм обучения кэширует результаты предыдущих средств оценки для последующего использования.

// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"))
        .AppendCacheCheckpoint(mlContext);
        .Append(mlContext.Regression.Trainers.Sdca());

Обучение модели машинного обучения

Когда данные пройдут предварительную обработку, используйте метод Fit для обучения модели машинного обучения с алгоритмом регрессии StochasticDualCoordinateAscent.

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);

Извлечение параметров модели

После обучения модели извлеките полученные ModelParameters для проверки или повторного обучения. LinearRegressionModelParameters предоставляют смещение и полученные коэффициенты или вес обученной модели.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Примечание.

Другие модели включают параметры, характерные для их задач. Например, алгоритм K-средних помещает данные в кластер на основе центроидов, а KMeansModelParameters содержит свойство, в котором хранятся полученные центроиды. Чтобы узнать больше, изучите Microsoft.ML.Trainersдокументацию по API и выполните поиск классов, в именах которых есть ModelParameters.

Оценка качества модели

Чтобы выбрать наиболее эффективную модель, необходимо оценить ее производительность на основе проверочных данных. Для измерения различных метрик обученной модели используйте метод Evaluate.

Примечание.

Метод Evaluate создает различные метрики в зависимости от того, на каком компьютере выполнялась задача машинного обучения. Чтобы узнать больше, изучите Microsoft.ML.Dataдокументацию по API и выполните поиск классов, в именах которых есть Metrics.

// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);

// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);

// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;

В приведенном выше фрагменте кода:

  1. Проверочный набор данных подвергается предварительной обработке с использованием предварительно заданных преобразований для подготовки данных.
  2. В обученной модели машинного обучения формируются прогнозы на основе проверочных данных.
  3. В методе Evaluate значения в столбцу CurrentPrice проверочного набора данных сравниваются со столбцом Score, куда сохраняются новые полученные прогнозы, и рассчитываются метрики модели регрессии, одна из которых, R-квадрат, хранится в переменной rSquared.

Примечание.

В этом небольшом примере из-за ограниченного объема данных значение R-квадрат не попадает в диапазон от 0 до 1. В реальной ситуации его значение должно быть в диапазоне от 0 до 1.