【问题标题】:How to gain acces to the bias and weights in ML.NET?如何访问 ML.NET 中的偏差和权重?
【发布时间】:2019-11-22 03:07:00
【问题描述】:

我在 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 类(这里称为模型)确实包含一个 Model 属性,但是尝试将其转换为 LinearRegressionModelParameters 类,如documentation 中所述,不起作用:

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

类型的对象 Microsoft.ML.Data.TransformerChain1[Microsoft.ML.Data.RegressionPredictionTransformer1[Microsoft.ML.Trainers.FastTree.FastTreeRegressionModelParameters]] 无法转换为 Microsoft.ML.ISingleFeaturePredictionTransformer`1[System.Object]

如何获取模型参数?

【问题讨论】:

    标签: c# neural-network linear-regression ml.net


    【解决方案1】:

    在这种情况下的问题是您的model 对象不是ISingleFeaturePredictionTransformer,而是TransformerChain 对象(即一系列转换器),其中LastTransformer 是“预测转换器” ”。

    所以要解决这个问题,首先将你的model 转换为TransformerChain&lt;RegressionPredictionTransformer&lt;FastTreeRegressionModelParameters&gt;&gt;,然后你可以得到LastTransformer,这将返回RegressionPredictionTransformer&lt;FastTreeRegressionModelParameters&gt;,从那里你可以得到Model 属性。

    如果您在编译时不知道 TransformerChain 将包含哪种具体类型的转换器,您可以将 model 转换为 IEnumerable&lt;ITransformer&gt; 并在链中获取 .Last() 转换器。您可以强制转换为 ISingleFeaturePredictionTransformer&lt;object&gt; 以获得 Model 属性。

        ITransformer model = ...;
        IEnumerable<ITransformer> chain = model as IEnumerable<ITransformer>;
    
        ISingleFeaturePredictionTransformer<object> predictionTransformer =
            chain.Last() as ISingleFeaturePredictionTransformer<object>;
    
        object modelParameters = predictionTransformer.Model;
    

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

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

    【讨论】:

    • 非常感谢您的帮助,非常感谢! modelParameters 确实包含 2 个权重和一个偏差,其中一个权重不应该是偏差吗?
    • 我确实意识到 actopozipc 很可能已经找到了他的问题的答案,但对于后代来说,这里有一个关于“偏见”是什么的很好的链接:stackoverflow.com/a/2499936/2731639
    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2019-09-26
    • 2018-03-05
    • 2021-11-07
    • 2018-10-20
    • 2019-08-04
    • 2017-12-01
    相关资源
    最近更新 更多