На сегодняшний день существует большое количество программных инструментов для создания моделей машинного обучения. Первые такие инструменты создавались в научной среде и среде статистиков, где популярны языки R и Python, исторически сложились экосистемы для обработки, анализа и визуализации данных именно на этих языках, хотя определенные библиотеки машинного обучения есть и для Java, Lua, С++. При этом интерпретируемые языки программирования существенно медленнее компилируемых языков, поэтому на интерпретируемом языке описывают подготовку данных и структуру моделей, а основные вычисления проводят на компилируемом языке. В данном обзоре внимание будет уделено преимущественно библиотекам, имеющим реализацию на Python, поскольку данный язык обладает большим количеством пакетов для интеграции в разного рода сервисы и системы, а также для написания различных информационных систем.
При выборе конкретных пакетов для решения задач в первую очередь стоит определиться, заложен ли в них механизм для решения ваших проблем. Так, например, для анализа изображений, скорее всего, придется иметь дело с нейронными сетями, а для работы с текстом — с рекурентными, при небольшом количестве данных от нейросетей наверняка придется отказаться. Наша статья содержит общее описание известных библиотек и будет полезна прежде всего тем, кто начинает изучать область машинного обучения и хочет примерно понимать, где искать реализации тех или иных методов.
Библиотеки общего назначения на Python
Все описанные в данном разделе пакеты так или иначе используются при решении практически любой задачи по машинному обучению. Более того, часто их достаточно, чтобы построить модель целиком, по крайней мере в первом приближении.
NumPy
Библиотека с открытым исходным кодом для выполнения операций линейной алгебры и численных преобразований. Как правило, такие операции необходимы для преобразования датасетов, которые можно представить в виде матрицы. В библиотеке реализовано большое количество операций для работы с многомерными массивами, преобразования Фурье и генераторы случайных чисел. Форматы хранения numpy де-факто являются стандартом для хранения числовых данных во многих других библиотеках (например, Pandas, Scikit-learn, SciPy).
Сайт: numpy.org
Pandas
Библиотека для обработки данных. С ее помощью можно загрузить данные практически из любого источника (интеграция с основными форматами хранения данных для машинного обучения), вычислить различные функции и создать новые параметры, построение запросов к данным с помощью агрегативных функций сродни реализованным в SQL. Кроме того, имеются разнообразные функции преобразования матриц, метод скользящего окна и прочие методы для получения информации из данных.
Сайт: pandas.pydata.org
Scikit-learn
Библиотека программного обеспечения с более чем десятилетней историей содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. Как правило, при программировании практически любой модели на языке Python какие-то преобразования с использованием данной библиотеки всегда присутствуют. Scikit-learn содержит методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение кросс-валидации. В библиотеке также содержатся основные алгоритмы машинного обучения: линейной регрессии (и ее модификаций Лассо, гребневой регрессии), опорных векторов, решающих деревьев и лесов и др. Также есть реализации основных методов кластеризации. Кроме того, в библиотеке есть постоянно используемые исследователями методы работы с параметрами (фичами): например, понижение размерности методом главных компонент. Частью пакета является библиотека imblearn, позволяющая работать с разбалансированными выборками и генерировать новые значения.
Сайт: scikit-learn.org
SciPy
Довольно обширная библиотека, предназначенная для проведения научных исследований. В ее состав входит большой набор функций из математического анализа, в том числе вычисление интегралов, поиск максимума и минимума, функции обработки сигналов и изображений. Во многих отношениях данную библиотеку можно считать аналогом пакета MATLAB для разработчиков на языке Python. C ее помощью можно решать системы уравнений, использовать генетические алгоритмы, выполнять многие задачи по оптимизации.
Сайт: scipy.org
Специфические библиотеки
В данном разделе рассмотрены библиотеки или со специфической сферой применимости, или популярные у ограниченного числа пользователей.
Tensorflow
Библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейросетей. Поддержка вычислений на видеокартах имеет версию для языка C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.
Сайт: tensorflow.org
Keras
Библиотека для построения нейросетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом (Embedding слов и т.д.). Интегрирован в Apache Spark с помощью дистрибутива dist-keras.
Сайт: Keras.io
Caffe
Фреймворк для обучения нейросетей от университета Беркли. Как и TensorFlow, использует cuDNN для работы с видеокартами NVIDIA. Содержит в себе реализацию большего количества известных нейросетей, один из первых фреймворков, интегрированных в Apache Spark (CaffeOnSpark).
Сайт: cafee.berkeleyvision.org
pyTorch
Позволяет портировать на язык Python библиотеку Torch для языка Lua. Содержит реализации алгоритмов работы с изображениями, статистических операций и инструментов работы с нейронными сетями. Отдельно можно создать набор инструментов для оптимизационных алгоритмов (в частности стохастического градиентного спуска).
Сайт: torch.ch
Реализации градиентного бустинга над решающими деревьями
Подобные алгоритмы неизменно вызывают сильный интерес, так как часто они показывают лучший результат, чем нейросети. Особенно это проявляется, если в вашем распоряжении не очень большие наборы данных (очень грубая оценка: тысячи и десятки тысяч, но не десятки миллионов). Среди моделей — победителей на соревновательной платформе kaggle алгоритмы градиентного бустинга над решающими деревьями встречаются довольно часто. Как правило, реализации таких алгоритмов есть в библиотеках машинного обучения широкого профиля (например, в Scikit-learn). Однако существуют особые реализации данного алгоритма, которые часто можно встретить среди победителей различных конкурсов. Стоит выделить следующие.
Xgboost
Самая популярная реализация градиентного бустинга. Появившись в 2014 г., уже к 2016-му она завоевала немалую популярность. Для выбора разбиения используют сортировку и модели, основанные на анализе гистограмм.
Сайт: github.com/dmlc/xgboost
LightGBM
Вариант градиентного бустинга от Microsoft вышедший в 2017 г. Для выбора критерия разбиения используется Gradient-based One-Side Sampling (GOSS). Имеются методы работы с категориальными признаками, т.е. с признаками, которые явно не выражаются числом (например, имя автора или марка машины). Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net.
Сайт: http://www.dmtk.io
CatBoost
Разработка компании Яндекс, вышедшая, как и LightGBM, в 2017 г. Реализует особый подход к обработке категориальных признаков (основанный на target encoding, т.е. на подмене категориальных признаков статистиками на основе предсказываемого значения). К тому же алгоритм содержит особый подход к построению дерева, который показал лучшие результаты. По сравнению, проведенному авторами, данный алгоритм лучше других работает прямо «из коробки», т.е. без настройки каких-либо параметров.
Сайт: catboost.yandex
Microsoft Cognitive Toolkit (CNTK)
Фреймворк от корпорации Microsoft, имеет интерфейс на C++. Предоставляет реализацию различных нейросетевых архитектур. Может быть интересной интеграцией с .Net.
Другие ресурсы для разработки
По мере популяризации машинного обучения неоднократно появлялись проекты по упрощению разработки и приведению его в графическую форму с доступом через онлайн. В данном поле можно отметить несколько.
Azure ML
Сервис машинного обучения на платформе Microsoft Azure, в котором можно выстраивать обработку данных в виде графа и проводить вычисления на удаленных серверах, с возможностью включения кода на языке Python и на других.
Cайт: azure.microsoft.com/ru-ru/services/machine-learning-studio
IBM DataScience experience (IBM DSX)
Сервис для работы в среде Jupyter Notebook с возможностью выполнять вычисления в языке Python и на других. Поддерживает интеграцию с известными наборами данных и Spark, проектом IBM Watson.
Сайт: datascience.ibm.com
Пакеты для социальных наук
Среди них можно выделить IBM Statistical Package for the Social Sciences (SPSS) — программный продукт IBM для обработки статистики в социальных науках, поддерживает графический интерфейс задания процесса обработки данных. Некоторое время назад стало можно встраивать алгоритмы машинного обучения в общую структуру выполнения. В целом, ограниченная поддержка алгоритмов машинного обучения становится популярной среди пакетов для статистиков, в которых уже включены статистические функции и методы визуализации (например, Tableau и SAS).
Заключение
Выбор программного пакета, на основе которого будет решаться задача, обычно определяется следующими условиями:
1. Окружение, в котором будет использоваться модель: необходима ли поддержка Spark, в какие сервисы нужно интегрироваться.
2. Особенности данных. Чем являются данные: изображением, текстом или это набор чисел, какая обработка им требуется?
3. Предрасположенность моделей к данному типу задач. Данные с изображений обычно обрабатывают сверточными нейронными сетями, а для небольших наборов данных используют алгоритмы, основанные на решающих деревьях.
4. Ограничения по вычислительным мощностям, как при обучении, так и при использовании.
Как правило, при разработке на языке Python использования библиотек общего назначения (Pandas, Scikit-learn, numPy) не избежать. Это привело к тому, что их интерфейс поддерживает большинство специализированных библиотек, но если это не так, надо понимать, что придется самому писать коннекторы или выбирать другую библиотеку. Построить первую модель можно, используя сравнительно небольшое число библиотек, а дальше придется принимать решение, на что тратить время: на проработку параметров (feature engineering) или на подбор оптимальной библиотеки и алгоритма, или же выполнять эти задачи параллельно. Теперь немного о рекомендациях по выбору. Если вам нужен алгоритм, который лучше всего работает прямо «из коробки», — это Catboost. Если вы предполагаете работать с изображениями, можно использовать Keras и Tensorflow или Caffe. При работе с текстом надо определиться, собираетесь ли вы строить нейросеть и учитывать контекст. Если да, те же пожелания, что и к изображениям, если достаточно «мешка слов» (частотных характеристик встречаемости каждого слова), подойдут алгоритмы градиентного бустинга. При небольших наборах данных можно использовать алгоритмы генерации новых данных из Scikit-learn и линейные методы, реализованные в той же библиотеке. Как правило, описанных библиотек хватает для решения большинства задач, даже для победы на соревнованиях. Область машинного обучения развивается очень быстро — мы уверены, что новые фреймворки появились уже в момент написания этой статьи.