Повторное обучение модели

Узнайте, как переобучать модель машинного обучения в ML.NET.

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

Следующие алгоритмы можно переобучить в ML.NET:

Загрузка предварительно обученной модели

Сначала загрузите предварительно обученную модель в приложение. Дополнительные сведения о загрузке конвейеров и моделей обучения см. в статье Сохранение и загрузка обученной модели.

// Create MLContext
MLContext mlContext = new MLContext();

// Define DataViewSchema of data prep pipeline and trained model
DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline
ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip", out dataPrepPipelineSchema);

// Load trained model
ITransformer trainedModel = mlContext.Model.Load("ogd_model.zip", out modelSchema);

Извлечение предварительно обученных параметров модели

После загрузки модели извлеките параметры обученной модели, получив доступ к Model свойству предварительно обученной модели. Предварительно обученная модель была обучена с помощью модели линейной регрессии OnlineGradientDescentTrainer, которая создает RegressionPredictionTransformer выходные LinearRegressionModelParametersданные. Эти параметры модели содержат смещение и вес или коэффициенты модели. Эти значения используются в качестве отправной точки для новой переобученной модели.

// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
    ((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;

Примечание.

Выходные данные параметров модели зависят от используемого алгоритма. Например, OnlineGradientDescentTrainer использует LinearRegressionModelParameters, а LbfgsMaximumEntropyMulticlassTrainer выводит MaximumEntropyModelParameters. При извлечении параметров модели приведите их к соответствующему типу.

Повторное обучение модели

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

// New Data
HousingData[] housingData = new HousingData[]
{
    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
    }
};

//Load New Data
IDataView newData = mlContext.Data.LoadFromEnumerable<HousingData>(housingData);

// Preprocess Data
IDataView transformedNewData = dataPrepPipeline.Transform(newData);

// Retrain model
RegressionPredictionTransformer<LinearRegressionModelParameters> retrainedModel =
    mlContext.Regression.Trainers.OnlineGradientDescent()
        .Fit(transformedNewData, originalModelParameters);

На этом этапе можно сохранить переобученную модель и использовать ее в приложении. Дополнительные сведения см. в статьях Сохранение и загрузка обученной модели и Прогнозирование с помощью обученной модели.

Сравнение параметров модели

Как вы знаете, если переобучение на самом деле произошло? Одним из способов было бы сравнить, отличаются ли параметры переобученной модели от параметров исходной модели. Следующий пример кода сравнивает исходный код с переобученными весами модели и выводит их в консоль.

// Extract Model Parameters of re-trained model
LinearRegressionModelParameters retrainedModelParameters = retrainedModel.Model as LinearRegressionModelParameters;

// Inspect Change in Weights
var weightDiffs =
    originalModelParameters.Weights.Zip(
        retrainedModelParameters.Weights, (original, retrained) => original - retrained).ToArray();

Console.WriteLine("Original | Retrained | Difference");
for(int i=0;i < weightDiffs.Count();i++)
{
    Console.WriteLine($"{originalModelParameters.Weights[i]} | {retrainedModelParameters.Weights[i]} | {weightDiffs[i]}");
}

В следующей таблице показано, как выглядят выходные данные.

Исходная Переобученная модель Расхождение
33 039,86 56 293,76 –23 253,9
29 099,14 49 586,03 –20 486,89
28 938,38 48 609,23 –19 670,85
30 484,02 53 745,43 –23 261,41