我想创建一个PMML管道,比如
PMMLPipeline([
("clt", ColumnTransformer([
("cl", Pipeline([
("std", StandardScaler()),
("pca", PCA(4) ),
("kmeans", KMeans(5) )
]), clVars),
("id", "passthrough", idVars)
])
),
("et", ExpressionTransformer("X[0]+X[1]")
),
("lr", LinearRegression()
)
])
有没有人知道在sklearn.compose.ColumnTransformer中使用估计器是否真的可行呢?
使用以下设置:
System:
python: 3.7.1 (default, Dec 14 2018, 19:28:38) [GCC 7.3.0]
executable: /opt/anaconda3/envs/python_3.7.1_eb/bin/python
machine: Linux-4.14.114-83.126.amzn1.x86_64-x86_64-with-glibc2.10
BLAS:
macros: HAVE_CBLAS=None, NO_ATLAS_INFO=-1
lib_dirs: /usr/lib64/atlas
cblas_libs: cblas
Python deps:
pip: 19.1.1
setuptools: 41.0.1
sklearn: 0.21.2
numpy: 1.16.4
scipy: 1.3.0
Cython: None
pandas: 0.24.2
我已经分别安装了每个步骤(clt、et和lr)。
然后,PMMLPipeline创建失败,并显示以下消息:
java.lang.IllegalArgumentException: Tuple contains an unsupported value (Python class sklearn.cluster.k_means_.KMeans)
at org.jpmml.sklearn.CastFunction.apply(CastFunction.java:43)
at com.google.common.collect.Lists$TransformingRandomAccessList$1.transform(Lists.java:612)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:47)
at sklearn.pipeline.Pipeline.encodeFeatures(Pipeline.java:68)
at sklearn2pmml.decoration.Alias.encodeFeatures(Alias.java:56)
at sklearn.compose.ColumnTransformer.encodeFeatures(ColumnTransformer.java:63)
at sklearn.pipeline.Pipeline.encodeFeatures(Pipeline.java:81)
at sklearn2pmml.pipeline.PMMLPipeline.encodePMML(PMMLPipeline.java:196)
at org.jpmml.sklearn.Main.run(Main.java:145)
at org.jpmml.sklearn.Main.main(Main.java:94)
如果我尝试在pandas数据帧上应用我拟合的ColumnTransformer,我可以通过使用predict
获得AttributeError: 'ColumnTransformer' object has no attribute 'predict'
,或者使用transform
获得一个包含5列的数组,该数组不包含clVars,也不包含kmeans的结果和匹配idVars的3列。因此我产生了怀疑:
发布于 2019-06-20 03:38:32
这个异常意味着SkLearn2PMML转换器在一个只希望找到transformer对象(TransformerMixin
的子类)的位置发现了一个估计器对象(KMeans
)。
根据Scikit-Learn约定,管道应该只包含一个估计器对象,作为最后一步。现在您有两个估计器对象(KMeans
和LinearRegression
)。
如果您遵循上面的约定,那么转换应该会成功。
https://stackoverflow.com/questions/56671537
复制相似问题