如何获取 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.RegressionPredictionTransformer
1[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
,因为您不会看到偏差和权重,而是会看到树信息。
我在 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.TransformerChain
1[Microsoft.ML.Data.RegressionPredictionTransformer
1[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
,因为您不会看到偏差和权重,而是会看到树信息。