首页 > 解决方案 > 是否可以将 sklearn 估计器放在 sklearn.compose.ColumnTransformer 中?

问题描述

我想创建一个 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)。

然后,PMMLipeline 创建失败:

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,我可以AttributeError: 'ColumnTransformer' object has no attribute 'predict'通过 usingpredict 或一个包含 5 列不包含 clVars 也不包含 kmeans 的结果和 3 列通过 using 匹配 idVars 的列来获得transform。因此我的怀疑:s

标签: python-3.xscikit-learnpmml

解决方案


此异常意味着 SkLearn2PMML 转换器在预期只能找到KMeans转换器对象( 的子类)的位置找到了估计器对象 ( ) TransformerMixin

根据 Scikit-Learn 的约定,管道应该只包含一个估计器对象,作为最后一步。现在你有两个估计器对象(KMeansLinearRegression)。

如果您遵守上述约定,那么转换应该会成功。


推荐阅读