Можно ли поместить оценки sklearn в sklearn.compose.ColumnTransformer? - PullRequest
0 голосов
/ 19 июня 2019

Я хотел бы создать конвейер 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)

Иесли я пытаюсь применить свой подогнанный ColumnTransformer к кадру данных pandas, я получу либо AttributeError: 'ColumnTransformer' object has no attribute 'predict', используя predict, либо массив с 5 столбцами, которые не содержат clVars, а также результат kmeans и 3 столбца, которые соответствуют idVars, используяtransform.Отсюда и мои сомнения: s

1 Ответ

0 голосов
/ 19 июня 2019

Это исключение означает, что преобразователь SkLearn2PMML обнаружил объект оценки (KMeans) в месте, где ожидаются только объекты-преобразователи (подклассы TransformerMixin).

Согласно соглашениям Scikit-Learn, конвейер должен содержать только один объект оценки, как последний шаг. Сейчас у вас есть два объекта оценки (KMeans и LinearRegression).

Если вы придерживаетесь вышеуказанного соглашения, преобразование должно быть успешным.

...