我使用sklearn训练了一个模型,并使用sklearn2pmml将其导出为pmml格式。有没有办法将该pmml文件转换回可以导入并在python中运行的东西?
我希望这样做的原因是因为我注意到与sklearn模型相比,pmml模型的行为方式略有不同。具体来说,pmml文件为变量设置了硬上限和下限(使用训练集中变量的最大值和最小值),而sklearn则没有。当pmml模型遇到超出这些边界的数据时,我遇到问题。这只是pmml模型和sklearn模型之间的一个区别,我希望能够将pmml文件重新导入到python中来运行它并查看是否还有其他文件。
答案 0 :(得分:1)
您无需测试sklearn2pmml生成模型的正确性。它基于JPMML-SkLearn库,完全覆盖了集成测试 - Scikit-Learn预测和PMML预测可证明相同。
您真正的问题是您希望在其预期的“适用性域”之外应用模型。这是一个小珠子的想法,因为在这种情况下没有指定模型的行为 - 垃圾输入,垃圾预测。
但是,如果您坚持必须能够在生产环境中向模型提供垃圾,那么只需禁用PMML值边界检查。有很多方法可以实现这一目标:
Value
元素中删除Interval
和/PMML/DataDictionary/DataField
子元素。Value
和Interval
子元素,以便将之前未见过的值识别为有效值。例如,您可以定义Input
元素的边距以包含所有值[-Inf,+ Inf]。有关正确的语法,请参阅PMML规范中Value
和Interval
元素的说明。invalidValueTreatment
元素的/PMML/<Model>/MiningSchema/MiningField
属性值从“returnInvalid”更改为“asIs”。如果缺少此属性,则默认为“returnInvalid”。所以你需要在那里插入invalidValueTreatment=asIs
。我会推荐选项#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, ...)