【问题标题】:Generating PMML from sklearn models with GridSearch in Python在 Python 中使用 GridSearch 从 sklearn 模型生成 PMML
【发布时间】:2017-11-22 09:52:15
【问题描述】:

我希望在 sklearn 中训练模型并通过 PMML 将它们导出到其他环境(使用 https://github.com/jpmml/sklearn2pmml)

我能够从普通(k-Nearest Neighbors)模型(没有 GridSearch)生成 PMML,但使用 GridSearch 时会出现以下错误 -

TypeError: 管道对象不是 PMMLPipeline 的实例

该错误是有道理的(因为 GridSearchCV 不返回 PMMLPipeline),但正在寻找有关如何将优化(w/GridSearch)模型导出到 PMML 的想法(例如,有没有办法在 PMMLPipeline 中包含 GridSearch)。

下面的代码 - 任何想法的 TIA。

from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import GridSearchCV

knn_pipe = PMMLPipeline([
("regressor", KNeighborsRegressor())
])

param_grid = {"regressor__n_neighbors": [3, 2,10],
          "regressor__weights": ["uniform","distance"],
          "regressor__algorithm": ["auto", "ball_tree", "kd_tree"]}

cv = GridSearchCV(knn_pipe, param_grid=param_grid)

print(train.drop('y',axis=1).shape)

cv.fit(X,Y)

best_parameters = cv.best_estimator_.get_params()
print("best parameter = {}".format(best_parameters))

from sklearn2pmml import sklearn2pmml
sklearn2pmml(cv, "kNNMercedes.pmml", with_repr = True)




['regressor__algorithm', 'regressor__n_neighbors', 'regressor__metric', 
'regressor__leaf_size', 'regressor', 'regressor__p', 
'regressor__metric_params', 'steps', 'regressor__n_jobs', 
'regressor__weights']
 (4209, 365)
best parameter = {'regressor__algorithm': 'auto', 'regressor__n_neighbors': 
10, 'regressor__metric': 'minkowski', 'regressor__leaf_size': 30, 'regressor': 
KNeighborsRegressor(algorithm='auto', leaf_size=30, metric='minkowski',
          metric_params=None, n_jobs=1, n_neighbors=10, p=2,
      weights='distance'), 'regressor__p': 2, 'regressor__metric_params': None, 'steps': [('regressor', KNeighborsRegressor(algorithm='auto', leaf_size=30, metric='minkowski',
      metric_params=None, n_jobs=1, n_neighbors=10, p=2,
      weights='distance'))], 'regressor__n_jobs': 1, 'regressor__weights': 
'distance'}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-d548c1bff799> in <module>()
 30 
 31 from sklearn2pmml import sklearn2pmml
---> 32 sklearn2pmml(cv, "kNNMercedes.pmml", with_repr = True)
 33 
 34 print("yeay PMML!")

/Users/venuv/.local/lib/python2.7/site-packages/sklearn2pmml/__init__.pyc in 
sklearn2pmml(pipeline, pmml, user_classpath, with_repr, debug)
125                 print("sklearn2pmml: ", __version__)
126         if(not isinstance(pipeline, PMMLPipeline)):
--> 127                 raise TypeError("The pipeline object is not an 
instance of " + PMMLPipeline.__name__)
128         cmd = ["java", "-cp", os.pathsep.join(_package_classpath() + user_classpath), "org.jpmml.sklearn.Main"]
129         dumps = []

TypeError: The pipeline object is not an instance of PMMLPipeline

【问题讨论】:

  • 你能发布完整的错误堆栈跟踪吗?此外,您尝试保存的 knn_pipe 尚未安装(训练)。
  • @VivekKumar 谢谢。我更新了代码(和堆栈跟踪)
  • 您只能在该命令中使用 PMMLPipeline 对象,因此会出现错误。你可以在 sklearn2pmml 行中使用cv.best_estimator_ 吗?

标签: python machine-learning scikit-learn pmml


【解决方案1】:

解决方案是在拟合的GridSearchCV 实例之外构造一个PMMLPipeline 实例:

pipeline = PMMLPipeline([
  ("best_estimator", cv.best_estimator_)
])
sklearn2pmml(pipeline, "pipeline.pmml")

用户@vivek-kumar 报告了 JPMML-SkLearn 项目的这个问题,并在那里收到了一些额外的 cmets。见jpmml/jpmml-sklearn#42

【讨论】:

  • 这不起作用。这里的主要问题是关于KNeighborsRegressor的参数weights的具体值(“距离)”。
  • 所以,从github.com/jpmml/jpmml-sklearn/issues/42 总结您的讨论(由我自己的原型验证) - 1. cv.best_estimator_ 本身就是一个 PMMLPipeline,2. 'distance' 不支持 aa weights fn 目前.因此,当我使用允许的权重函数运行它时,没有“距离”的 GridSearchCV 可以工作,而不必将其包装在另一个管道中。谢谢你的想法
  • GridSearchCV 适用于uniform 权重函数,但不适用于distance。如果您将PMMLPipeline 作为第一个参数传递给GridSearchCV,则无需重新包装任何内容(因为cv.best_estimator 也将是PMMLPipeline)。但是,如果第一个参数是“原始”估计器,那么您需要将其包装为如上所示。原始错误消息“管道对象不是 PMMLPipeline 的实例”表明您正在/正在处理“原始”估计器,因此需要包装。
  • 是的,在 sklearn2pmml 命令中使用cv 时需要换行。但在您的回答中,您正在使用 cv.best_estimator_ 并包装它,这是不需要的。
猜你喜欢
  • 2019-11-24
  • 2019-02-22
  • 2014-09-12
  • 2017-01-04
  • 1970-01-01
  • 2018-06-20
  • 2020-02-20
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多