有没有办法将pmml文件导入python?

时间:2017-03-10 15:43:21

标签: python scikit-learn sklearn-pandas pmml

我使用sklearn训练了一个模型,并使用sklearn2pmml将其导出为pmml格式。有没有办法将该pmml文件转换回可以导入并在python中运行的东西?

我希望这样做的原因是因为我注意到与sklearn模型相比,pmml模型的行为方式略有不同。具体来说,pmml文件为变量设置了硬上限和下限(使用训练集中变量的最大值和最小值),而sklearn则没有。当pmml模型遇到超出这些边界的数据时,我遇到问题。这只是pmml模型和sklearn模型之间的一个区别,我希望能够将pmml文件重新导入到python中来运行它并查看是否还有其他文件。

1 个答案:

答案 0 :(得分:1)

您无需测试sklearn2pmml生成模型的正确性。它基于JPMML-SkLearn库,完全覆盖了集成测试 - Scikit-Learn预测和PMML预测可证明相同。

您真正的问题是您希望在其预期的“适用性域”之外应用模型。这是一个小珠子的想法,因为在这种情况下没有指定模型的行为 - 垃圾输入,垃圾预测。

但是,如果您坚持必须能够在生产环境中向模型提供垃圾,那么只需禁用PMML值边界检查。有很多方法可以实现这一目标:

  1. Value元素中删除Interval/PMML/DataDictionary/DataField子元素。
  2. 修改ValueInterval子元素,以便将之前未见过的值识别为有效值。例如,您可以定义Input元素的边距以包含所有值[-Inf,+ Inf]。有关正确的语法,请参阅PMML规范中ValueInterval元素的说明。
  3. 将所有invalidValueTreatment元素的/PMML/<Model>/MiningSchema/MiningField属性值从“returnInvalid”更改为“asIs”。如果缺少此属性,则默认为“returnInvalid”。所以你需要在那里插入invalidValueTreatment=asIs
  4. 我会推荐选项#3。您可以使用JPMML-Model库自动执行该过程:

    org.dmg.pmml.PMML pmml = loadFromFile(..)
    org.dmg.pmml.Visitor mfUpdater = new org.jpmml.model.visitors.AbstractVisitor(){
      @Override
      public VisitorAction visit(MiningField miningField){
        miningField.setInvalidValueTreatment(InvalidValueTreatmentMethod.AS_IS);
        return VisitorAction.CONTINUE;
      }
    }
    mfUpdater.applyTo(pmml);
    saveToFile(pmml, ...)