Язык R часто критикуют за отсутствие точной копии питоновской библиотеки для машинного обучения класса "все в одном" scikit-learn. Но страдать от отсутствия фреймворков не приходится – наоборот, есть совсем другая проблема. А именно: что выбрать из нескольких имеющихся в наличии библиотек (caret, mlr, h2o, pipelearner). Большинство из них отличаются от scikit-learn тем, что не содержат собственных реализаций алгоритмов машинного обучения, используя вместо этого реализации из сторонних пакетов. Это приводит к необходимости бороться с неодинаковыми интерфейсами функций для обучения моделей и предсказаний на их основе. К счастью, в caret и mlr эта задача успешно решена.
Ниже приводится сравнение этих фреймворков по шести самым важным, на мой взгляд, пунктам:
- Качество документации и примеров.
- Количество доступных моделей и способов оценки их качества, а также наличие алгоритмов для отбора признаков.
- Расширяемость / кастомизация.
- Возможность объединения в цепочку операций по подготовке данных (трансформация, импутация) с перекрестной проверкой / ресемплированием и самим обучением моделей.
- Реализация метаобучения (ансамбли моделей).
- Производительность.
1. caret
- Помимо встроенной справки и руководства на сайте имеется книга от разработчика, которая может служить еще и отличным учебником по машинному обучению: Applied Predictive Modeling. Много примеров в интернете, много вопросов и ответов на StackOverflow.
- На момент написания этого сообщения доступно 233 модели: Available Models. Недостатком можно считать то, что представлены только модели для регрессии и классификации. Реализовано достаточно много популярных метрик. Есть несколько способов отбора признаков: от исключения признаков с околонулевой дисперсией до генетических алгоритмов.
- Можно писать свои собственные метрики качества и обертки для моделей. Это особенно полезно с учетом того, что не все гиперпараметры сделаны настраиваемыми в имеющихся обертках.
- Возможности имеются, но ограниченные: можно выполнить стандартизацию или трансформацию при помощи PCA, импутацию средним или при помощи метода k-ближайших соседей. Однако новые варианты предобработки так просто не добавить. UPD: если верить Custom preprocessing in caret, скоро все будет (за ссылку спасибо S.Skripko).
- Ансамбли моделей можно обучать при помощи пакета caretEnsemble. Правильно реализован стекинг: Understanding caretEnsemble.
- Есть поддержка параллельных вычислений с использованием foreach. В остальном производительность зависит от используемой реализации того или иного алгоритма.
2. mlr
- Пакет более новый, материалов и примеров по нему меньше. Документирован хорошо, разобраться в любом вопросе можно без проблем.
- Количество моделей меньше, чем для caret, но список более разнообразен. В частности, можно использовать модели для кластеризации и анализа выживаемости, чего нет в caret. Более широкие возможности для оценки качества, в том числе функции для анализа ROC-кривых.
- Широчайшие возможности по кастомизации: можно легко добавлять новые модели, метрики, способы импутации и методы отбора признаков.
- Все этапы можно объединять в цепочки (суть в том, чтобы операции предобработки выполнялись на каждой итерации перекрестной проверки, а не один раз для всего набора данных – это более корректный подход). Более того, можно использовать функцию preProcess() из caret. Отдельно хочу отметить наличие Nested Resampling.
- Есть возможность обучать метамодели при помощи makeStackedLearner (как просто на предсказаниях по всем данным, так и реализуя полноценный стекинг).
- Есть поддержка параллельных вычислений, см. Parallelization.
3. H2O
- Обширная документация, примеры и книга Practical Machine Learning with H2O.
- Моделей немного, и все они реализованы на Java (пакеты для R и Python просто используют API). Есть линейные модели, "случайный лес", градиентный бустинг, нейросети прямого распространения (включая автокодировщики), PCA, GLRM, KNN, наивный байесовский классификатор и Word2vec. Также существует отдельная "обертка" для использования deep learning-библиотек, в т.ч. mxnet. Для отбора признаков алгоритмов нет.
- Возможности кастомизации нулевые.
- Предобработку нужно делать до загрузки данных в H2O.
- Есть функция h2o.stackedEnsemble().
- Сильная сторона этой библиотеки – работа с большими объемами данных. Есть поддержка многопоточных вычислений, можно создавать кластеры из нескольких ПК (см. сообщение) или же использовать H2O вместе со Spark-ом.
4. pipelearner
Ранее писал об этом пакете: Про пакет pipelearner и проникаемость веществ через Сaco2-клетки. Если коротко, то в нем самом нет почти ничего из перечисленного выше, он лишь предоставляет базовые возможности по разбивке набора данных на блоки и для обучения моделей, все остальное нужно реализовывать своими силами.
Дополнение от Юрия Тукачева: пакет easyml
Дополнение от Юрия Тукачева: пакет easyml
The easyml (easy machine learning) package lowers the barrier to entry to machine learning and is ideal for undergraduate/graduate students, and practitioners who want to quickly apply machine learning algorithms to their research without having to worry about the best practices of implementing each algorithm.
Комментариев нет:
Отправить комментарий