在Python中使用GridSearch从sklearn模型生成PMML

在Python中使用GridSearch从sklearn模型生成PMML,python,machine-learning,scikit-learn,pmml,Python,Machine Learning,Scikit Learn,Pmml,我希望在sklearn中培训模型,并通过PMML(使用)将其导出到其他环境中执行 我能够从普通(k-最近邻)模型(没有GridSearch)生成PMML,但是GridSearch会出现以下错误- TypeError:管道对象不是PMMLPipeline的实例 该错误是有意义的(因为GridSearchCV不返回PMMLPipeline),但正在考虑如何将优化(w/GridSearch)模型导出到PMML(例如,是否有方法将GridSearch包含在PMMLPipeline中) 下面的代码-TIA

我希望在sklearn中培训模型,并通过PMML(使用)将其导出到其他环境中执行

我能够从普通(k-最近邻)模型(没有GridSearch)生成PMML,但是GridSearch会出现以下错误-

TypeError:管道对象不是PMMLPipeline的实例 该错误是有意义的(因为GridSearchCV不返回PMMLPipeline),但正在考虑如何将优化(w/GridSearch)模型导出到PMML(例如,是否有方法将GridSearch包含在PMMLPipeline中)

下面的代码-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
从sklearn.com导入Kneighbors回归器
从sklearn.model_选择导入GridSearchCV
knn_管道=PMML管道([
(“回归器”,kneighborsressegator())
])
param_grid={“回归器n_邻居”:[3,2,10],
“回归器权重”:[“均匀”、“距离”],
“回归算法”:[“自动”、“球树”、“kd树”]}
cv=网格搜索cv(knn_管道,参数网格=参数网格)
打印(序列下降('y',轴=1).形状)
等速配合(X,Y)
最佳参数=cv.最佳估计量
打印(“最佳参数={}”。格式(最佳参数))
从sklearn2pmml导入sklearn2pmml
sklearn2pmml(cv,“knnmmercedes.pmml”,带_repr=True)
[‘回归器算法’、‘回归器n_近邻’、‘回归器度量’,
“回归器叶大小”、“回归器”、“回归器叶大小”,
“回归器度量参数”、“步骤”、“回归器作业”,
“回归器权重”]
(4209, 365)
最佳参数={'regressor\uuu algorithm':'auto','regressor\uu n\u Neights':
10,‘回归器度量’:‘minkowski’,‘回归器叶大小’:30,‘回归器’:
Kneighbors回归器(算法='auto',叶大小=30,度量='minkowski',
度量参数=None,n_作业=1,n_邻居=10,p=2,
权重='distance'),'regressor_uup':2,'regressor_umetric_params':无,'steps':[('regressor',Kneighbors regressor(algorithm='auto',leaf_size=30,metric='minkowski',
度量参数=None,n_作业=1,n_邻居=10,p=2,
权重=“距离”)],“回归器作业”:1,“回归器权重”:
“距离”}
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
30
31从sklearn2pmml导入sklearn2pmml
--->32 sklearn2pmml(cv,“knnmmercedes.pmml”,带_repr=True)
33
34打印(“YeayPMML!”)
/中的Users/venuv/.local/lib/python2.7/site packages/sklearn2pmml/_init__.pyc
sklearn2pmml(管道,pmml,用户类路径,带报告,调试)
125打印(“sklearn2pmml:,_版本_;)
126如果(不存在(管道、PMMLPipeline)):
-->127 raise TypeError(“管道对象不是
“+PMMLPipeline.\u_名称\u_”的实例
128 cmd=[“java”,“-cp”,os.pathsep.join(_package_classpath()+user_classpath),“org.jpmml.sklearn.Main”]
129次转储=[]
TypeError:管道对象不是PMMLPipeline的实例

解决方案是在安装的
GridSearchCV
实例上构建一个
PMMLPipeline
实例:

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

User@vivek kumar在JPMML SkLearn项目中报告了这个问题,并在那里收到了一些额外的评论。请参见

您可以发布完整的错误堆栈跟踪吗?此外,您试图保存的knn_管道尚未安装(经过培训)。@VivekKumar谢谢。我更新了代码(和堆栈跟踪),您只能在该命令中使用PMMLPipeline对象,因此出现了错误。您可以在sklearn2pmml行中使用
cv.best\u estimator\uu
吗?这不起作用。这里的主要问题是关于Kneighbors回归器的参数
权重的特定值(“距离”)。因此,总结您的讨论(通过我自己的原型验证)-1。cv.best_估计器本身就是一个PMML管道,2'“距离”目前不受权重fn的支持。因此,当我使用允许的权重函数运行GridSearchCV时,不带“距离”的GridSearchCV就可以工作,而无需将其包装到另一个管道中。感谢您的想法
GridSearchCV
使用
uniform
weights函数,但不使用
distance
。如果将
PMMLPipeline
作为第一个参数传递给
GridSearchCV
,则无需重新包装任何内容(因为
cv.best_estimator
也将是
PMMLPipeline
)。但是,如果第一个参数是“原始”估计量,那么您需要将其包装为如上所示。原始错误消息“管道对象不是PMMLPipeline的实例”表示您正在/正在处理“原始”估算器,因此需要进行包装。是的,当sklearn2pmml命令中使用
cv
时,需要进行包装。但是在你的答案中,你使用了
cv.best\u estimator\uu
并包装了它,这是不需要的。