我正在尝试遵循example for PFI。我管道的最后一个转换是MLContext.MulticlassClassification.PermutationFeatureImportance
,因此IPredictionTransformer<IPredictor>
是该类型。但是,var trainedModel = (TransformerChain<ITransformer>)mlContext.Model.Load(stream);
var predictor = trainedModel.OfType<IPredictionTransformer<IPredictor>>().FirstOrDefault();
期望R version 3.4.4
。感觉该示例在设计时考虑了非常具体的管道。
我通过ML.Net gitter渠道获得了此提示:
您可以遍历变压器链管道。Fit(trainingDataView)直到找到IPredictionTransformer
但是,我看不到如何执行该迭代。我尝试了以下操作,但预测变量为空。
roxygen2
我想念什么?
答案 0 :(得分:0)
显然,从ML.Net 0.10开始,转换器链可以具有子转换器链。以下返回所需的变压器:
public static IPredictionTransformer<IPredictor> FindPredictionTransformer(this TransformerChain<ITransformer> chain)
{
var xf = chain.OfType<IPredictionTransformer<IPredictor>>().FirstOrDefault();
if (xf != null) return xf;
foreach (var t in chain.OfType<TransformerChain<ITransformer>>())
{
var xfChild = t.OfType<IPredictionTransformer<IPredictor>>().FirstOrDefault();
if (xfChild != null) return xfChild;
}
return null;
}
用法:
TransformerChain<ITransformer> trainedModel;
using (var stream = new FileStream(modelPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
trainedModel = (TransformerChain<ITransformer>)mlContext.Model.Load(stream);
}
var predictionTransformer = trainedModel.FindPredictionTransformer();
var featureImportance = PfiHelper.CalculatePfi(mlContext, predictionTransformer, trainingDataView);
对于我来说,目前尚不清楚为什么在某些情况下需要对孩子TransformerChain<ITransformer>
进行迭代,或者是否有必要进行更深入的搜索(孙子等)。我希望通过评论或其他答案来澄清该问题。