пятница, 7 июля 2017 г.

Обзор фреймворков для машинного обучения на R

Язык R часто критикуют за отсутствие точной копии питоновской библиотеки для машинного обучения класса "все в одном" scikit-learn. Но страдать от отсутствия фреймворков не приходится – наоборот, есть совсем другая проблема. А именно: что выбрать из нескольких имеющихся в наличии библиотек (caret, mlrh2opipelearner). Большинство из них отличаются от scikit-learn тем, что не содержат собственных реализаций алгоритмов машинного обучения, используя вместо этого реализации из сторонних пакетов. Это приводит к необходимости бороться с неодинаковыми интерфейсами функций для обучения моделей и предсказаний на их основе. К счастью, в caret и mlr эта задача успешно решена.

Ниже приводится сравнение этих фреймворков по шести самым важным, на мой взгляд, пунктам:
  1. Качество документации и примеров.
  2. Количество доступных моделей и способов оценки их качества, а также наличие алгоритмов для отбора признаков.
  3. Расширяемость / кастомизация.
  4. Возможность объединения в цепочку операций по подготовке данных (трансформация, импутация) с перекрестной проверкой / ресемплированием и самим обучением моделей.
  5. Реализация метаобучения (ансамбли моделей).
  6. Производительность.


1. caret

  1. Помимо встроенной справки и руководства на сайте имеется книга от разработчика, которая может служить еще и отличным учебником по машинному обучению: Applied Predictive Modeling. Много примеров в интернете, много вопросов и ответов на StackOverflow. 
  2. На момент написания этого сообщения доступно 233 модели: Available Models. Недостатком можно считать то, что представлены только модели для регрессии и классификации. Реализовано достаточно много популярных метрик. Есть несколько способов отбора признаков: от исключения признаков с околонулевой дисперсией до генетических алгоритмов.
  3. Можно писать свои собственные метрики качества и обертки для моделей. Это особенно полезно с учетом того, что не все гиперпараметры сделаны настраиваемыми в имеющихся обертках. 
  4. Возможности имеются, но ограниченные: можно выполнить стандартизацию или трансформацию при помощи PCA, импутацию средним или при помощи метода k-ближайших соседей. Однако новые варианты предобработки так просто не добавить. UPD: если верить Custom preprocessing in caret, скоро все будет (за ссылку спасибо S.Skripko).
  5. Ансамбли моделей можно обучать при помощи пакета caretEnsemble. Правильно реализован стекинг: Understanding caretEnsemble.
  6. Есть поддержка параллельных вычислений с использованием foreach. В остальном производительность зависит от используемой реализации того или иного алгоритма.

2. mlr

  1. Пакет более новый, материалов и примеров по нему меньше. Документирован хорошо, разобраться в любом вопросе можно без проблем.
  2. Количество моделей меньше, чем для caret, но список более разнообразен. В частности, можно использовать модели для кластеризации и анализа выживаемости, чего нет в caret. Более широкие возможности для оценки качества, в том числе функции для анализа ROC-кривых.
  3. Широчайшие возможности по кастомизации: можно легко добавлять новые модели, метрики, способы импутации и методы отбора признаков.
  4. Все этапы можно объединять в цепочки (суть в том, чтобы операции предобработки выполнялись на каждой итерации перекрестной проверки, а не один раз для всего набора данных  это более корректный подход). Более того, можно использовать функцию preProcess() из caret. Отдельно хочу отметить наличие Nested Resampling.
  5. Есть возможность обучать метамодели при помощи makeStackedLearner (как просто на предсказаниях по всем данным, так и реализуя полноценный стекинг).
  6. Есть поддержка параллельных вычислений, см. Parallelization.

3. H2O

  1. Обширная документация, примеры и книга Practical Machine Learning with H2O.
  2. Моделей немного, и все они реализованы на Java (пакеты для R и Python просто используют API). Есть линейные модели, "случайный лес", градиентный бустинг, нейросети прямого распространения (включая автокодировщики), PCA, GLRM, KNN, наивный байесовский классификатор и Word2vec. Также существует отдельная "обертка" для использования deep learning-библиотек, в т.ч. mxnet. Для отбора признаков алгоритмов нет.
  3. Возможности кастомизации нулевые.
  4. Предобработку нужно делать до загрузки данных в H2O.
  5. Есть функция h2o.stackedEnsemble().
  6. Сильная сторона этой библиотеки  работа с большими объемами данных. Есть поддержка многопоточных вычислений, можно создавать кластеры из нескольких ПК (см. сообщение) или же использовать H2O вместе со Spark-ом.

4. pipelearner

Ранее писал об этом пакете: Про пакет pipelearner и проникаемость веществ через Сaco2-клетки. Если коротко, то в нем самом нет почти ничего из перечисленного выше, он лишь предоставляет базовые возможности по разбивке набора данных на блоки и для обучения моделей, все остальное нужно реализовывать своими силами.

Дополнение от Юрия Тукачева: пакет 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.

1 комментарий: