无法获得适合PFI的变压器

时间:2019-03-25 18:32:25

标签: .net ml.net

我正在尝试遵循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

我想念什么?

1 个答案:

答案 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>进行迭代,或者是否有必要进行更深入的搜索(孙子等)。我希望通过评论或其他答案来澄清该问题。