Как приспособить и оценить модели машинного обучения в приложении на основе Java/JVM
Не могли бы вы рассказать мне о том, как создавать и выполнять модели машинного обучения / статистические модели (регрессия, дерево решений, K означает кластеризацию, наивный байесовский анализ, система показателей / линейная / логистическая регрессия и т. Д. И GBM, GLM) в приложениях на основе Java/JVM (в производстве).
У нас есть ETL-подобный продукт на основе Java, в котором можно выполнить большинство этапов подготовки данных для машинного обучения, таких как получение данных из JDBC, файлы, HDFS, отсутствие SQL и т. Д., Объединения и агрегирование и т. Д.(Которые необходимы для разработки функций). и теперь мы хотим добавить возможности Analytics, используя машинное обучение / статистическое моделирование.
Сейчас мы используем JPMML-оценщик для оценки моделей, созданных в формате PMML, используя R и python (и Knime), но для этого требуется три отдельных и не связанных шага:- 1- первый шаг для подготовки данных в нашем приложении Java/JVM и сохранения данные выборки (обучение и тестирование) данных в CSV-файле или в БД, - 2- Создать модель машинного обучения на R и Python (и Knime) и экспортировать ее в формате PMML 4.2 - 3- Импортировать / развернуть PMML в нашей Java приложение и использовать оценщик JPMML для его запуска в производство.
Я уверен, что это общая проблема в машинном обучении, так как обычно в Production 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 (Embed Python in Java) для встраивания Cpython в JVM? Кто-нибудь пробовал это для моделей sci-kit?
В качестве альтернативы, я должен изучить возможность использования библиотек машинного обучения на основе Mahout или weka - java в моем приложении на основе JVM.(Мне нужно поддерживать как Windows, так и не Windows платформы)
Я также исследую H2Oai, который основан на Java. Кто-нибудь пробовал это?
3 ответа
Я нашел достойное решение для моей проблемы. Я использую H2O.ai, разработанный на Java, для масштабируемого машинного обучения с открытым исходным кодом. Он предлагает API в Java (Restful API), Python, R и Scala. Он имеет лучшие в своем классе алгоритмы классификации, регрессии, кластеризации и т. Д., А также легко интегрируется с Apache Hadoop и Spark (газированная вода), если у кого-то есть кластер Spark. Он также предлагает алгоритм глубокого обучения, основанный на многослойной искусственной нейронной сети с прямой связью. Я использую API привязки Java /Rest API и иногда низкоуровневый API H2o (для управления кластером узлов h2o 3).
Я сталкиваюсь с другой альтернативой на основе Java, называемой Smile - Statistic Machine Intelligence и Learning Engine, которая обеспечивает регрессию, классификацию, кластеризацию, анализ правил ассоциации, выбор функций и т. Д. Есть ли у кого-нибудь еще отзывы об этих или подобных библиотеках ML на основе Java?
Я использую 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-приложении.
Если у вас есть ETL с бэкэндом HDFS, я бы предложил развернуть Spark на кластере и использовать алгоритмы машинного обучения Spark MLib. Они поддерживают методы, которые вы упомянули выше.
Не возражаете ли вы дать некоторый контекст относительно того, с каким размером (строки, столбцы, тип) данных, с которыми вы планируете работать? Java не будет моим рекомендованным языком перехода для ML, но Scala компилируется в байт-код JVM и имеет синтаксис, аналогичный Java (в дополнение к наличию Java API).
Если вы создаете подтверждение концепции, тогда Java - это хорошо, но если вы планируете работать с большими данными, это не очень хорошо масштабируется.