有没有办法将 pmml 文件导入 python?
Posted
技术标签:
【中文标题】有没有办法将 pmml 文件导入 python?【英文标题】:Is there a way to import a pmml file into python? 【发布时间】:2017-08-01 00:44:10 【问题描述】:我使用 sklearn 训练了一个模型,并使用 sklearn2pmml 将其导出为 pmml 格式。有没有办法将该 pmml 文件转换回可以在 python 中导入和运行的东西?
我之所以这样做,是因为我注意到 pmml 模型与 sklearn 模型的行为方式略有不同。具体来说,pmml 文件为变量设置了严格的上限和下限(使用训练集中变量的最大值和最小值),而 sklearn 没有。当 pmml 模型遇到超出这些界限的数据时,我会遇到问题。这只是 pmml 模型和 sklearn 模型之间的区别之一,我希望能够将 pmml 文件重新导入 python 来运行它,看看是否还有其他的。
【问题讨论】:
经典问题:如果您使用 Python 训练模型并希望使用 Python 部署它们,为什么需要这个 PMML 中间步骤?为什么不泡菜? 我使用 python 来构建模型,但我要部署它的团队使用 java,因此转换为 pmml 根据型号的不同,复制***.com/questions/41630562/chaid-pmml-parsing-in、***.com/questions/41466964/…、***.com/questions/40048987/…、***.com/questions/41383735/…和/或***.com/questions/40532336/… ... 【参考方案1】:您无需测试 sklearn2pmml 生成模型的正确性。它基于 JPMML-SkLearn 库,该库全面覆盖集成测试 - Scikit-Learn 预测和 PMML 预测可证明是相同的。
您真正的问题是您想在其预期的“适用范围”之外应用模型。这是一个很好的主意,因为在这种情况下没有指定模型的行为 - 垃圾输入、垃圾预测。
但是,如果您坚持必须能够在生产环境中向模型提供垃圾,那么只需禁用 PMML 值边界检查即可。有很多方法可以做到这一点:
-
从
/PMML/DataDictionary/DataField
元素中删除Value
和Interval
子元素。
修改Value
和Interval
子元素,以便将那些以前看不见的值识别为有效值。例如,您可以定义 Input
元素的边距以包含所有值 [-Inf, +Inf]。请参阅 PMML 规范中对 Value
和 Interval
元素的说明以了解正确的语法。
将所有/PMML/<Model>/MiningSchema/MiningField
元素的invalidValueTreatment
属性值从“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, ...)
【讨论】:
此外,sklearn2pmml 允许您在模型生成期间指定asIs
无效值处理。只需在 Python 脚本中将 CountinuousDomain()
替换为 ContinuousDomain(invalid_value_treatment = "as_is")
:github.com/jpmml/sklearn2pmml/blob/master/sklearn2pmml/…以上是关于有没有办法将 pmml 文件导入 python?的主要内容,如果未能解决你的问题,请参考以下文章