如何获取 ML.NET 中的偏差和权重?

How to gain acces to the bias and weights in ML.NET?

我在 ML.NET 中得到了一个线性回归模型并且预测工作正常:

  MLContext mlContext = new MLContext(seed: 0);
            List<TwoInputRegressionModel> inputs = new List<TwoInputRegressionModel>();
            foreach (var JahrMitCO in ListWithCO)
            {
                float tempyear = JahrMitCO.Year;
                foreach (var JahrMitPopulation in Population)
                {
                    if (JahrMitPopulation.Year == tempyear)
                    {
                        inputs.Add(new TwoInputRegressionModel() { Year = tempyear, Population = JahrMitPopulation.Value, Co2 = JahrMitCO.Value });
                    }
                }
            }
            var model = Train(mlContext, inputs);
            TestSinglePrediction(mlContext, model); //works

但我想知道如何获取训练模型的参数(权重+偏差)?我确实知道 ITransformer class(此处称为模型)确实包含一个模型 属性,但是尝试将其转换为 LinearRegressionModelParameters class 就像 documentation 中所述的那样不起作用:

 LinearRegressionModelParameters originalModelParameters = ((ISingleFeaturePredictionTransformer<object>)model).Model as LinearRegressionModelParameters; //Exception:System.InvalidCastException

The object of the type Microsoft.ML.Data.TransformerChain1[Microsoft.ML.Data.RegressionPredictionTransformer1[Microsoft.ML.Trainers.FastTree.FastTreeRegressionModelParameters]] can not be converted to Microsoft.ML.ISingleFeaturePredictionTransformer`1[System.Object]

如何获取模型参数?

这种情况下的问题是您的 model 对象不是 ISingleFeaturePredictionTransformer,而是 TransformerChain 对象(即转换器链),其中LastTransformer 是 "prediction transformer".

所以要解决这个问题,首先将您的 model 转换为 TransformerChain<RegressionPredictionTransformer<FastTreeRegressionModelParameters>>,然后您可以获得 LastTransformer,这将 return 的 RegressionPredictionTransformer<FastTreeRegressionModelParameters>,来自在那里你可以得到 Model 属性.

如果您在编译时碰巧不知道 TransformerChain 将包含哪种具体类型的转换器,您可以将 model 转换为 IEnumerable<ITransformer> 并在中获取 .Last() 转换器连锁,链条。您可以转换为 ISingleFeaturePredictionTransformer<object> 以获得 Model 属性.

    ITransformer model = ...;
    IEnumerable<ITransformer> chain = model as IEnumerable<ITransformer>;

    ISingleFeaturePredictionTransformer<object> predictionTransformer =
        chain.Last() as ISingleFeaturePredictionTransformer<object>;

    object modelParameters = predictionTransformer.Model;

从那里你可以将 modelParameters 转换为任何特定的 ModelParameters class 它恰好是。

注意:从您的异常消息来看,您似乎不是在训练线性回归模型,而是在训练快速树模型。基于树的模型将无法转换为 LinearRegressionModelParameters,因为您不会看到偏差和权重,而是会看到树信息。