Как избежать макс.количество полей ввода для JPMML - PullRequest
0 голосов
/ 02 марта 2019

У меня проблемы с использованием моделей PMML в JPMML (scala) со многими полями ввода.Найдите минимальный пример ниже: Загрузите изображение с разрешением 300x150 пикселей и используйте его в качестве входных данных для PCA (python):

img = PIL.Image.open(filename)
img = img.resize(STANDARD_SIZE) # 300x150
img = np.array([int(np.mean(a)) for a in img])

pca   = PCA(svd_solver=pca_method,n_components = components)
train = pca.fit_transform(train_x)

pipeline = PMMLPipeline(([('pca', pca), ('knn', neigh)]))
sklearn2pmml(pipeline, "/tmp/pca.pmml")

На втором шаге эта модель должна быть загружена с использованием JPMML (scala):

val evaluator = new LoadingModelEvaluatorBuilder()
      .setLocatable(false)
      .load(new File("/tmp/pca.pmml"))
      .build()
evaluator.verify()

, что приведет к совершенно очевидному исключению:

Exception in thread "main" org.jpmml.evaluator.InvalidElementException: Model has too many input fields
    at org.jpmml.evaluator.ModelEvaluatorBuilder.checkSchema(ModelEvaluatorBuilder.java:135)
    at org.jpmml.evaluator.ModelEvaluatorBuilder.build(ModelEvaluatorBuilder.java:115)
    ...

Если вы посмотрите на исходный код, вы можете найти следующий предел в ModelEvaluatorBuilder:

if((inputFields.size() + groupFields.size()) > 1000){
            throw new InvalidElementException("Model has too many input fields", miningSchema);
        }

Так что мои поля ввода 45k слишком много.Если я правильно понял документацию PMML, я могу использовать только атомарные типы данных (int, char, double и т. Д.) Для полей inpt.

Есть идеи, как я могу обойти этот предел?

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете переопределить метод ModelEvaluatorBuilder#checkSchema(ModelEvaluator) своей собственной логикой проверки (например, «принять все»):

evaluator = new LoadingModelEvaluatorBuilder(){
    @Override
    protected void checkSchema(ModelEvaluator<?> modelEvaluator){
        // Anything goes - I'm willing to accept the responsibility for my own actions 
    }
}
    .setLocatable(false)
    .load(new File("/tmp/pca.pmml"))
    .build();

Эта проверка работоспособности существует по причине.(J) PMML не предназначен для обработки двоичных двоичных объектов (таких как изображения), и очень плохая идея представлять объект изображения в виде 45-килобайтных двойных полей.

...