【问题标题】:sklearn2pmml and jpmml-sklearn Usage Errorssklearn2pmml 和 jpmml-sklearn 使用错误
【发布时间】:2016-03-08 17:52:46
【问题描述】:

我最近在寻找将 scikit-learn 模型转换为 PMML 的方法时遇到了 sklearn2pmmljpmml-sklearn。但是,在尝试使用我无法弄清楚的基本用法示例时,我遇到了错误。

在尝试使用 sklearn2pmml 中的示例时,我收到了以下关于将 long 转换为 int 的问题:

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    at numpy.core.NDArrayUtil.getShape(NDArrayUtil.java:66)
    at org.jpmml.sklearn.ClassDictUtil.getShape(ClassDictUtil.java:92)
    at org.jpmml.sklearn.ClassDictUtil.getShape(ClassDictUtil.java:76)
    at sklearn.linear_model.BaseLinearClassifier.getCoefShape(BaseLinearClassifier.java:144)
    at sklearn.linear_model.BaseLinearClassifier.getNumberOfFeatures(BaseLinearClassifier.java:56)
    at sklearn.Classifier.createSchema(Classifier.java:50)
    at org.jpmml.sklearn.Main.run(Main.java:104)
    at org.jpmml.sklearn.Main.main(Main.java:87)
Traceback (most recent call last):
  File "C:\Users\user\workspace\sklearn_pmml\test.py", line 40, in <module>
    sklearn2pmml(iris_classifier, iris_mapper, "LogisticRegressionIris.pmml")
  File "C:\Python27\lib\site-packages\sklearn2pmml\__init__.py", line 49, in sklearn2pmml
    os.remove(dump)
WindowsError: [Error 32] The process cannot access the file because it is being used by another process: 'c:\\users\\user\\appdata\\local\\temp\\tmpmxyp2y.pkl'

对这里发生的事情有什么建议吗?

使用代码:

#
# Step 1: feature engineering
#

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

import pandas
import sklearn_pandas

iris = load_iris()

iris_df = pandas.concat((pandas.DataFrame(iris.data[:, :], columns = ["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]), pandas.DataFrame(iris.target, columns = ["Species"])), axis = 1)

iris_mapper = sklearn_pandas.DataFrameMapper([
    (["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"], PCA(n_components = 3)),
    ("Species", None)
])

iris = iris_mapper.fit_transform(iris_df)

#
# Step 2: training a logistic regression model
#

from sklearn.linear_model import LogisticRegressionCV

iris_X = iris[:, 0:3]
iris_y = iris[:, 3]

iris_classifier = LogisticRegressionCV()
iris_classifier.fit(iris_X, iris_y)

#
# Step 3: conversion to PMML
#

from sklearn2pmml import sklearn2pmml

sklearn2pmml(iris_classifier, iris_mapper, "LogisticRegressionIris.pmml")

编辑 12/6: 在新的更新之后,同样的问题出现在更远的地方:

Dec 06, 2015 5:56:49 PM sklearn_pandas.DataFrameMapper updatePMML
INFO: Updating 1 target field and 3 active field(s)
Dec 06, 2015 5:56:49 PM sklearn_pandas.DataFrameMapper updatePMML
INFO: Mapping target field y to Species
Dec 06, 2015 5:56:49 PM sklearn_pandas.DataFrameMapper updatePMML
INFO: Mapping active field(s) [x1, x2, x3] to [Sepal.Length, Sepal.Width, Petal.Length, Petal.Width]
Traceback (most recent call last):
  File "C:\Users\user\workspace\sklearn_pmml\test.py", line 40, in <module>
    sklearn2pmml(iris_classifier, iris_mapper, "LogisticRegressionIris.pmml")
  File "C:\Python27\lib\site-packages\sklearn2pmml\__init__.py", line 49, in sklearn2pmml
    os.remove(dump)
WindowsError: [Error 32] The process cannot access the file because it is being used by another process: 'c:\\users\\user\\appdata\\local\\temp\\tmpqeblat.pkl'

【问题讨论】:

  • 你的 Python 版本、NumPy 版本、Scikit-Learn 版本是什么?
  • Python 2.7.9、NumPy 1.9.3、scikit-learn 0.17

标签: java python scikit-learn pmml


【解决方案1】:

JPMML-SkLearn 预计 ndarray.shapei4 的元组(由 Pyrolite 库映射到 java.lang.Integer)。然而,在这种情况下,它是一个 i8 的元组(映射到 java.lang.Long)。因此出现强制转换异常。

此问题已在 JPMML-SkLearn commit f7c16ac2fb 中得到解决。

如果您遇到另一个异常(平台之间的数据转换可能很棘手),那么您还应该打开一个关于它的 JPMML-SkLearn 问题。

【讨论】:

  • 这次脚本跑得更远了,但出现了类似的问题。以后会有类似的修复还是我应该打开 JPMML-Sklearn 的问题?
  • 请用 JPMML-SkLearn 打开一个问题并在那里发布您的异常堆栈跟踪。已知该项目可以在 64 位 Linux 上正确构建和运行,但您似乎使用的是(64 位?)Windows。看起来这两个平台在 Scikit-Learn/Numpy/Python 堆栈的某个地方默认使用不同的数据类型。
猜你喜欢
  • 2017-06-01
  • 2018-12-20
  • 2018-11-03
  • 2012-05-06
  • 2016-01-05
  • 2021-05-09
  • 2013-09-01
  • 2020-03-21
  • 2020-06-05
相关资源
最近更新 更多