как подогнать и оценить модели машинного обучения в приложении на основе Java / JVM

Не могли бы вы рассказать мне, как создавать и выполнять модели / статистические модели машинного обучения (регрессия, дерево решений, K означает кластеризацию, наивный байес, систему показателей / линейную / логистическую регрессию и т. Д. И GBM, GLM) в приложении на основе Java / JVM. (в производстве).

У нас есть продукт на основе Java, своего рода ETL, где можно выполнять большую часть шагов по подготовке данных для машинного обучения, таких как прием данных из JDBC, файлов, HDFS, без SQL и т. Д., Объединения и агрегации и т. Д. (Которые требуются для разработки функций) и теперь мы хотим добавить возможности аналитики с помощью машинного обучения / статистического моделирования.

Прямо сейчас мы используем JPMML-оценщик для оценки моделей, созданных в формате PMML с использованием R и python (и Knime), но для этого требуются три отдельных и несвязанных шага: - 1- первый шаг для подготовки данных в нашем приложении Java / JVM и сохранение данные выборки (обучающие и тестовые) данные в файле csv или в БД, - 2- Создайте модель машинного обучения в R и python (и Knime) и экспортируйте ее в формат PMML 4.2 - 3- Импортируйте / разверните PMML в нашей Java на основе приложения и использовать оценщик JPMML для его выполнения в производственной среде.

Я уверен, что это распространенная проблема в машинном обучении, поскольку обычно в производственной среде JAVA предпочтительнее Python или R. Не могли бы вы предложить лучший подход (-ы) для создания, а также выполнения модели машинного обучения на основе python / scikit в JVM на основе применение.

Что вы думаете о более плавном выполнении шагов 2 и 3 в приложении на основе JVM без ущерба для производительности и удобства использования: -

1- Вызовите java-программу, которая внутренне вызывает сценарий python scikit (под капотом), чтобы создать модель в PMML, а затем использовать оценщик JPMML. Он будет делать вид, что пользователь работает в одном приложении на основе JVM (лучшее удобство использования). Я не уверен, каковы ограничения и недостатки использования PMML, поскольку не все функции поддерживаются в jpmml-sklearn. 2- Вызовите java-программу, которая внутренне вызывает скрипт python и выполняет создание модели, а также выполнение во внешней среде python и сериализует модель и результаты в файл / csv или в БД памяти (или в кеше, например, hazelcast) из где родительское приложение Java будет получать результаты и т. д. Я исследовал, что я не могу использовать Jython для выполнения моделей Sci-kit. 3- Могу ли я использовать Jep (встраивать Python в Java) для встраивания Cpython в JVM? Кто-нибудь пробовал для моделей sci-kit?

В качестве альтернативы мне следует изучить возможность использования библиотек машинного обучения на основе Mahout или weka - java в моем приложении на основе JVM. (Мне нужно поддерживать как платформы Windows, так и платформы, отличные от Windows)

Я также изучаю H2Oai, основанный на java. Кто-нибудь пробовал.


person Gaurav Gupta    schedule 12.06.2016    source источник


Ответы (3)


Я использую IntelliJ IDEA с плагином python. Таким образом, у меня есть и Java-код, и Python-код в одном проекте. Данные есть в базе данных; соединение всегда видно и доступно, независимо от того, есть ли у меня в редакторе файл .java или .py. В списке конфигураций вы можете иметь сценарии Python, приложения Java, цели maven и т. Д. Поэтому я не думаю, что вам нужно смешивать код Python и Java вместе (вызывая сценарии Python из Java). Это совершенно не нужно.

Мой рабочий процесс (все в IntelliJ IDEA): 1. Подготовить данные (обычно SQL) 2. Запустить скрипт python, который применяет конвейер преобразователей к фрейму данных pandas, построенному из определенной таблицы базы данных, и выводит PMML. 3. Используйте модель scikit-learn в своем приложении Java.

person Volokh    schedule 16.02.2018

Если у вас есть ETL с бэкэндом HDFS, я бы предложил развернуть Spark в кластере и использовать MLib от Spark. алгоритмы машинного обучения. Они поддерживают методы, о которых вы упомянули выше.

Не могли бы вы дать некоторый контекст относительно размера (строк, столбцов, типа) данных, с которыми вы планируете работать? Я бы не рекомендовал Java для ML, но Scala компилируется в байт-код JVM и имеет синтаксис, аналогичный java (помимо наличия Java API).

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

person lohithbb    schedule 10.03.2017
comment
Объем данных недостаточен для установки Spark / Hadoop. Обычно он варьируется от 50 до 1 ГБ (с несколькими сотнями строк). Сейчас я использую [H2o, ai] (h2o.ai), поскольку он основан на java, поэтому он хорошо с моим продуктом на основе Java. Но у него ограниченные алгоритмы машинного обучения (нет SVM и т. Д.). В конце концов, я хотел бы вызвать python (или R) из моего приложения на основе Java, чтобы использовать богатый набор алгоритмов машинного обучения. - person Gaurav Gupta; 18.04.2017
comment
Я имею в виду, что размер данных составляет от 50 МБ до 1 ГБ (макс.) - person Gaurav Gupta; 18.04.2017
comment
Учитывая эти размеры данных, реализация ML в Python или R. должна быть тривиальной. Я бы посоветовал вместо того, чтобы пытаться вызвать R или Python из Java, сериализовать данные в принимаемый формат (например, CSV) и выполнить системный вызов ( batch / bash) для запуска обработки на Python или R. Это связано с вашей необходимостью поддерживать кроссплатформенную компиляцию. - person lohithbb; 18.04.2017
comment
Кроме того, поскольку вы перемещаете данные между разными фреймворками, я бы посоветовал вам потратить некоторое время на разработку набора схем для моделей, которые вы хотите разработать. Затем разработайте программное обеспечение, которое соответствует этим интерфейсам в соответствии с требованиями - это естественным образом создаст основу для вашей модели и структуру тестирования для надежной разработки. - person lohithbb; 18.04.2017

Я нашел достойное решение своей проблемы. Я использую H2O.ai, разработанный на Java для масштабируемого машинного обучения с открытым исходным кодом. Он предлагает API-интерфейсы на Java (Restful API), Python, R и Scala. Он имеет лучшие в своем классе алгоритмы для классификации, регрессии, кластеризации и т. Д. И легко интегрируется с Apache Hadoop и Spark (газированная вода), если у кого-то есть кластер Spark. Он также предлагает алгоритм глубокого обучения, основанный на многослойной искусственной нейронной сети с прямой связью. Я использую API привязки Java / Rest API, а иногда и низкоуровневый API H2o (для управления кластером узлов h2o 3).

Я столкнулся с другой альтернативой на основе Java, которая называется Smile - статистический машинный интеллект и механизм обучения, который обеспечивает регрессию, классификация, кластеризация, анализ ассоциативных правил, выбор функций и т. д. Есть ли у кого-нибудь еще отзывы об этих или аналогичных библиотеках машинного обучения на основе Java?

person Gaurav Gupta    schedule 13.09.2017