首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python3.6中调用sklearn2pmml()函数会抛出RuntimeError

在Python3.6中调用sklearn2pmml()函数会抛出RuntimeError
EN

Stack Overflow用户
提问于 2019-04-30 15:12:29
回答 1查看 1.3K关注 0票数 3

我正在尝试将管道对象保存为PMML,而Python抛出了一个RuntimeError。

我的Python版本是3.6sklearn2pmml版本是0.44.0,JDK版本是1.8.0_201

所有这些都符合软件包的前提条件。

以下是我到目前为止所做的工作。(我不包括数据加载和清理部分)

代码语言:javascript
复制
from sklearn2pmml.pipeline import PMMLPipeline
from sklearn2pmml import make_pmml_pipeline, sklearn2pmml

logit_pipline = Pipeline([('vect', CountVectorizer(ngram_range=(1,2))), ('tfidf', TfidfTransformer(use_idf=True)), ('clf', LogisticRegression(C=11.3))])
pmml_pipeline = PMMLPipeline([("logit", logit_pipline)])
pmml_pipeline.fit(X, Y)

sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)

在我运行上面提到的最后一行之后发生的事情是...

代码语言:javascript
复制
sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)
Standard output is empty
Standard error:
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Parsing PKL..
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Parsed PKL in 230 ms.
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
INFO: Converting..
Apr 30, 2019 11:59:04 AM org.jpmml.sklearn.Main run
SEVERE: Failed to convert
java.lang.IllegalArgumentException: Expected an estimator object as the last step, got a transformer object (Python class sklearn.pipeline.Pipeline)
        at sklearn2pmml.pipeline.PMMLPipeline.getEstimator(PMMLPipeline.java:541)
        at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:93)
        at org.jpmml.sklearn.Main.run(Main.java:145)
        at org.jpmml.sklearn.Main.main(Main.java:94)

Exception in thread "main" java.lang.IllegalArgumentException: Expected an estimator object as the last step, got a transformer object (Python class sklearn.pipeline.Pipeline)
        at sklearn2pmml.pipeline.PMMLPipeline.getEstimator(PMMLPipeline.java:541)
        at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:93)
        at org.jpmml.sklearn.Main.run(Main.java:145)
        at org.jpmml.sklearn.Main.main(Main.java:94)

Traceback (most recent call last):

  File "<ipython-input-129-f5c307b4aaba>", line 1, in <module>
    sklearn2pmml(pmml_pipeline, 'logit.pmml', with_repr=True)

  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn2pmml\__init__.py", line 252, in sklearn2pmml
    raise RuntimeError("The JPMML-SkLearn conversion application has failed. The Java executable should have printed more information about the failure into its standard output and/or standard error streams")

RuntimeError: The JPMML-SkLearn conversion application has failed. The Java executable should have printed more information about the failure into its standard output and/or standard error streams

现在根据一些人的说法,这是一些JDK兼容性问题,使用JDK版本1.9和更高版本或1.6和更低版本会引发这种问题。但是既然我的JDK版本是sklearn2pmml可以接受的,为什么会出现这种错误呢?

EN

回答 1

Stack Overflow用户

发布于 2019-04-30 19:39:22

正如底层Java异常所表明的那样,sklearn2pmml.pipeline.PMMLPipeline类需要使用步骤列表进行参数化,其中最后一步包含一些估计器对象。在本例中,您使用一个单元素的步骤列表对PMMLPipeline进行参数化;最后一步包含一个Pipeline对象,从这个意义上讲,它不是一个估计器对象。

要解决这个问题,只需去掉中间的logit_pipline层(将管道包装在管道中到底是什么意思呢?)。

例如,这是可行的:

代码语言:javascript
复制
logit_pipline = PMMLPipeline([..])
logit_pipeline.fit(X, y)
sklearn2pmml(logit_pipeline, "logit.pmml")

这个问题与JDK、Python或Scikit-Learn版本完全无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55915658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档