Сегодня существует большое количество программных инструментов для создания моделей Machine Learning. Первые такие инструменты формировались в среде ученых и статистиков, где популярны языки R и Python, исторически сложились экосистемы для обработки, анализа и визуализации данных именно на этих языках, хотя определенные библиотеки машинного обучения есть и для Java, Lua, С++. При этом интерпретируемые языки программирования существенно медленнее компилируемых, поэтому на интерпретируемом языке описывают подготовку данных и структуру моделей, а основные вычисления проводят на компилируемом языке.
В данном посте мы расскажем преимущественно о библиотеках, имеющих реализацию на Python, поскольку этот язык обладает большим количеством пакетов для интеграции в разного рода сервисы и системы, а также для написания различных информационных систем. Материал содержит общее описание известных библиотек и будет полезен прежде всего тем, кто начинает изучать область ML и хочет примерно понимать, где искать реализации тех или иных методов.
При выборе конкретных пакетов для решения задач в первую очередь стоит определиться, заложен ли в них механизм для решения ваших проблем. Так, например, для анализа изображений, скорее всего, придется иметь дело с нейронными сетями, а для работы с текстом — с рекурентными, при небольшом количестве данных от нейросетей наверняка придется отказаться.
Библиотеки общего назначения на Python
Все описанные в данном разделе пакеты так или иначе используются при решении практически любой задачи по машинному обучению. Часто их достаточно, чтобы построить модель целиком, по крайней мере в первом приближении.
NumPy
Библиотека с открытым исходным кодом для выполнения операций линейной алгебры и численных преобразований. Как правило, такие операции необходимы для преобразования датасетов, которые можно представить в виде матрицы. В библиотеке реализовано большое количество операций для работы с многомерными массивами, преобразования Фурье и генераторы случайных чисел. Форматы хранения numpy де-факто являются стандартом для хранения числовых данных во многих других библиотеках (например, Pandas, Scikit-learn, SciPy).
Сайт: www.numpy.org
Pandas
Библиотека для обработки данных. С ее помощью можно загрузить данные практически из любого источника (интеграция с основными форматами хранения данных для машинного обучения), вычислить различные функции и создать новые параметры, построение запросов к данным с помощью агрегативных функций сродни реализованным в SQL. Кроме того, имеются разнообразные функции преобразования матриц, метод скользящего окна и прочие методы для получения информации из данных.
Сайт: pandas.pydata.org
Scikit-learn
Библиотека программного обеспечения с более чем десятилетней историей содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. Как правило, при программировании практически любой модели на языке Python какие-то преобразования с использованием данной библиотеки всегда присутствуют.
Scikit-learn содержит методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение кросс-валидации. В библиотеке также есть основные алгоритмы машинного обучения: линейной регрессии (и ее модификаций Лассо, гребневой регрессии), опорных векторов, решающих деревьев и лесов и др. Есть и реализации основных методов кластеризации. Кроме того, библиотека содержит постоянно используемые исследователями методы работы с параметрами (фичами): например, понижение размерности методом главных компонент. Частью пакета является библиотека imblearn, позволяющая работать с разбалансированными выборками и генерировать новые значения.
Сайт: www.scikit-learn.org
SciPy
Довольно обширная библиотека, предназначенная для проведения научных исследований. В ее состав входит большой набор функций из математического анализа, в том числе вычисление интегралов, поиск максимума и минимума, функции обработки сигналов и изображений. Во многих отношениях данную библиотеку можно считать аналогом пакета MATLAB для разработчиков на языке Python. C ее помощью можно решать системы уравнений, использовать генетические алгоритмы, выполнять многие задачи по оптимизации.
Сайт: www.scipy.org
Специфические библиотеки
В данном разделе рассмотрены библиотеки или со специфической сферой применимости, или популярные у ограниченного числа пользователей.
Tensorflow
Библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейросетей. Поддержка вычислений на видеокартах имеет версию для языка C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.
Сайт: www.tensorflow.org
Keras
Библиотека для построения нейросетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом (Embedding слов и т.д.). Интегрирована в Apache Spark с помощью дистрибутива dist-keras.
Сайт: www.keras.io
Caffe
Фреймворк для обучения нейросетей от университета Беркли. Как и TensorFlow, использует cuDNN для работы с видеокартами NVIDIA. Содержит в себе реализацию большего количества известных нейросетей, один из первых фреймворков, интегрированных в Apache Spark (CaffeOnSpark).
Сайт: cafee.berkeleyvision.org
pyTorch
Позволяет портировать на язык Python библиотеку Torch для языка Lua. Содержит реализации алгоритмов работы с изображениями, статистических операций и инструментов работы с нейронными сетями. Отдельно можно создать набор инструментов для оптимизационных алгоритмов (в частности стохастического градиентного спуска).
Сайт: www.torch.ch
Реализации градиентного бустинга над решающими деревьями
Подобные алгоритмы неизменно вызывают повышенный интерес, так как часто они показывают лучший результат, чем нейросети. Особенно это проявляется, если в вашем распоряжении не очень большие наборы данных (очень грубая оценка: тысячи и десятки тысяч, но не десятки миллионов). Среди моделей-победителей на соревновательной платформе kaggle алгоритмы градиентного бустинга над решающими деревьями встречаются довольно часто.
Как правило, реализации таких алгоритмов есть в библиотеках машинного обучения широкого профиля (например, в Scikit-learn). Однако существуют особые реализации данного алгоритма, которые часто можно встретить среди победителей различных конкурсов. Стоит выделить следующие.
Xgboost
Самая распространенная реализация градиентного бустинга. Появившись в 2014 г., уже к 2016-му она завоевала немалую популярность. Для выбора разбиения используют сортировку и модели, основанные на анализе гистограмм.
Сайт: github.com/dmlc/xgboost
LightGBM
Вариант градиентного бустинга от Microsoft, вышедший в 2017 г. Для выбора критерия разбиения используется Gradient-based One-Side Sampling (GOSS). Имеются методы работы с категориальными признаками, т.е. с признаками, которые явно не выражаются числом (например, имя автора или марка машины). Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net.
Сайт: www.dmtk.io
CatBoost
Разработка компании Яндекс, вышедшая, как и LightGBM, в 2017 г. Реализует особый подход к обработке категориальных признаков (основанный на target encoding, т.е. на подмене категориальных признаков статистиками на основе предсказываемого значения). К тому же алгоритм содержит особый подход к построению дерева, который показал лучшие результаты. Проведенное нами сравнение показало, что данный алгоритм лучше других работает прямо «из коробки», т.е. без настройки каких-либо параметров.
Сайт: catboost.yandex
Microsoft Cognitive Toolkit (CNTK)
Фреймворк от корпорации Microsoft, имеет интерфейс на C++. Предоставляет реализацию различных нейросетевых архитектур. Может быть интересной интеграцией с .Net.
Сайт: www.microsoft.com/en-us/cognitive-toolkit
Другие ресурсы для разработки
По мере популяризации машинного обучения неоднократно появлялись проекты по упрощению разработки и приведению его в графическую форму с доступом через онлайн. В данном поле можно отметить несколько.
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.
Сайт: ibm.com/cloud/watson-studio
Пакеты для социальных наук
Среди них можно выделить IBM Statistical Package for the Social Sciences (SPSS) — программный продукт IBM для обработки статистики в социальных науках, поддерживает графический интерфейс задания процесса обработки данных. Некоторое время назад стало можно встраивать алгоритмы машинного обучения в общую структуру выполнения. В целом, ограниченная поддержка алгоритмов машинного обучения становится популярной среди пакетов для статистиков, в которых уже включены статистические функции и методы визуализации (например, Tableau и SAS).
Заключение
Выбор программного пакета, на основе которого будет решаться задача, обычно определяется следующими условиями.
- Окружение, в котором будет использоваться модель: необходима ли поддержка Spark, в какие сервисы нужно интегрироваться.
- Особенности данных. Чем являются данные: изображением, текстом или это набор чисел, какая обработка им требуется?
- Предрасположенность моделей к данному типу задач. Данные с изображений обычно обрабатывают сверточными нейронными сетями, а для небольших наборов данных используют алгоритмы, основанные на решающих деревьях.
- Ограничения по вычислительным мощностям, как при обучении, так и при использовании.
Как правило, при разработке на языке Python использования библиотек общего назначения (Pandas, Scikit-learn, numPy) не избежать. Это привело к тому, что их интерфейс поддерживает большинство специализированных библиотек, но, если это не так, надо понимать, что придется самому писать коннекторы или выбирать другую библиотеку.
Построить первую модель можно, используя сравнительно небольшое число библиотек, а дальше придется принимать решение, на что тратить время: на проработку параметров (feature engineering) или на подбор оптимальной библиотеки и алгоритма, или же выполнять эти задачи параллельно.
Теперь немного о рекомендациях по выбору. Если вам нужен алгоритм, который лучше всего работает прямо «из коробки», — это Catboost. Если вы предполагаете работать с изображениями, можно использовать Keras и Tensorflow или Caffe. При работе с текстом надо определиться, собираетесь ли вы строить нейросеть и учитывать контекст. Если да, те же пожелания, что и к изображениям, если достаточно «мешка слов» (частотных характеристик встречаемости каждого слова), подойдут алгоритмы градиентного бустинга. При небольших наборах данных можно использовать алгоритмы генерации новых данных из Scikit-learn и линейные методы, реализованные в той же библиотеке.
Как правило, описанных библиотек хватает для решения большинства задач, даже для победы на соревнованиях. Область машинного обучения развивается очень быстро — мы уверены, что новые фреймворки появились уже в момент написания этого поста.
Николай Князев, руководитель группы машинного обучения «Инфосистемы Джет»
vpatcera
> CatBoost
> Проведенное нами сравнение показало, что данный алгоритм лучше других работает прямо «из коробки», т.е. без настройки каких-либо параметров.
Опыт участников kaggle говорит о другом — лидером и по качеству, и по скорости является именно LightGBM (речь о CPU вариантах — ходят слухи о невероятной крутости GPU варианта CatBoost, но на практике никто кроме Yandex его видимо пока никто не использует). Просьба поделиться Вашими исследованиями.
JetHabr Автор
Лидером по скорости, несомненно, является LightGBM, после тюна параметров часто тоже. Но в случае, если совсем не задавать гиперпараметры и просто применять алгоритм на данных быстро, то catboost сразу показывает результаты, помогающие оценить порядок точности. Пробовали как на наших датасетах, так и есть исследования Яндекса, например, с конференции Smart Data, там же обещали GPU, но пока новостей не видели.
roryorangepants
Вам не кажется, что если мы хотим быстро оценить порядок точности, то нам скорость работы важнее, чем то, что CatBoost выжмет лишних полпроцента по сравнению с другими бустингами? Ведь это всё равно грубая оценка.
vpatcera
У меня катбуст «из коробки» без тюна параметров показывает плачевные результаты на игрушечных датасетах. 20 секунд — серьезно?
roryorangepants
Примерно на это я и намекал. CatBoost медленнее даже xgboost'a, что уж говорить про LightGBM, который ещё быстрее.
JetHabr Автор
Да по скорости как правило проигрывает, это правда
JetHabr Автор
В приведенном коде нет задания категориальных переменных — одной из важных «фишек» Кэтбуста. подробное сравнение можно прочитать здесь, например towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db Хотя, конечно, зависит от датасета.
JetHabr Автор
Это слишком абстрактно — смотря какие порядки. Если разница в несколько минут, то можно и подождать, это сильно быстрее, чем тюнить руками, и отнимает меньше времени.
roryorangepants
Вы не уловили идею: если мы не будем тюнить, то нам лучше получить результат за 20 секунд, а не за 10 минут, а если мы будем тюнить, то почему не брать сразу LightGBM, который в итоге даст лучше точность?
JetHabr Автор
Разница не всегда такая большая. Кэтбусту хватает и нескольких минут, и, пока он учится, мы можем заниматься другим.
Графики AUC vs время обучения в сравнении catboost с другими алгоритмами можно найти в этой презентации от Яндекса assets.ctfassets.net/oxjq45e8ilak/1NtBCBQxXCaAOwy8kumUKu/edccea9c32bdf119e10417367cc85602/_________________________________________CatBoost___________________________________________________________________________.pdf
roryorangepants
Какая разница, большая она или нет? Для грубой оценки нам всё равно выгоднее взять более быстрый алгоритм (во всяком случае вы пока не назвали ни одного аргумента, почему это не так).
>презентации от Яндекса
Даже открывать не нужно, чтобы предугадать результаты.
JetHabr Автор
Не совсем. При грубой оценке хочется выбирать наиболее приближенный к лучшему значению, если это сравнимо по времени.
Если утрировать, то самым быстрым алгоритмом тогда можно взять линейную регрессию и просто решающее дерево, однако это не даст вменяемый потолок.
Вопрос в балансе скорости получения результата и адекватности полученного результата. За счет быстроты работы к Lightgbm, например, быстрее подобрать гиперпараметры, однако если просто попробовать, без задания грида и as is, то это может быть не лучшим, т.к. нет уверенности что это не плюс-минус километр (как, например, при применении необученного RandomForest из scikit-learn).
urands
GPU у катбуста достаточно быстрый, но вероятно у меня не так много оперативки: после завершения активных вычислений он начинает что то активно туда кидать (катбуст затребовал 40 ГБ оперативки): и того 20 мин работы GPU и я ждал 8 часов так и не дождался результата, в итоге решил поберечь свой жесткий диск.
sply
У вас немного дезинформации: Torch и PyTorch — это два разных человека. И, собственно, PyTorch — на питоне.
QtRoS
В какой-то мере Ваш ответ тоже ошибочен. Совсем разными библиотеки тоже назвать нельзя, ядро то же самое (SO)
JetHabr Автор
Это миграция библиотеки для MatLab Torch на язык питон с сохранением функционала, грубо говоря. В данном обзоре мы рассматривали именно Python с упором на функциональную разницу.
artiom_n
Добавьте данные по пакетам Matlab пожалуйста, хотя бы по этому пакету, а ещё лучше обзор решений, который вообще для него есть.