重新定型模型

了解如何在 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]}");
}

下表顯示輸出可能呈現的結果。

原始 重新定型 差數
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938.38 48609.23 -19670.85
30484.02 53745.43 -23261.41