Сегодня существует большое количество программных инструментов для создания моделей 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).

Заключение


Выбор программного пакета, на основе которого будет решаться задача, обычно определяется следующими условиями.

  1. Окружение, в котором будет использоваться модель: необходима ли поддержка Spark, в какие сервисы нужно интегрироваться.
  2. Особенности данных. Чем являются данные: изображением, текстом или это набор чисел, какая обработка им требуется?
  3. Предрасположенность моделей к данному типу задач. Данные с изображений обычно обрабатывают сверточными нейронными сетями, а для небольших наборов данных используют алгоритмы, основанные на решающих деревьях.
  4. Ограничения по вычислительным мощностям, как при обучении, так и при использовании.

Как правило, при разработке на языке Python использования библиотек общего назначения (Pandas, Scikit-learn, numPy) не избежать. Это привело к тому, что их интерфейс поддерживает большинство специализированных библиотек, но, если это не так, надо понимать, что придется самому писать коннекторы или выбирать другую библиотеку.

Построить первую модель можно, используя сравнительно небольшое число библиотек, а дальше придется принимать решение, на что тратить время: на проработку параметров (feature engineering) или на подбор оптимальной библиотеки и алгоритма, или же выполнять эти задачи параллельно.

Теперь немного о рекомендациях по выбору. Если вам нужен алгоритм, который лучше всего работает прямо «из коробки», — это Catboost. Если вы предполагаете работать с изображениями, можно использовать Keras и Tensorflow или Caffe. При работе с текстом надо определиться, собираетесь ли вы строить нейросеть и учитывать контекст. Если да, те же пожелания, что и к изображениям, если достаточно «мешка слов» (частотных характеристик встречаемости каждого слова), подойдут алгоритмы градиентного бустинга. При небольших наборах данных можно использовать алгоритмы генерации новых данных из Scikit-learn и линейные методы, реализованные в той же библиотеке.

Как правило, описанных библиотек хватает для решения большинства задач, даже для победы на соревнованиях. Область машинного обучения развивается очень быстро — мы уверены, что новые фреймворки появились уже в момент написания этого поста.

Николай Князев, руководитель группы машинного обучения «Инфосистемы Джет»

Комментарии (17)


  1. vpatcera
    03.07.2018 15:10
    +4

    > CatBoost
    > Проведенное нами сравнение показало, что данный алгоритм лучше других работает прямо «из коробки», т.е. без настройки каких-либо параметров.

    Опыт участников kaggle говорит о другом — лидером и по качеству, и по скорости является именно LightGBM (речь о CPU вариантах — ходят слухи о невероятной крутости GPU варианта CatBoost, но на практике никто кроме Yandex его видимо пока никто не использует). Просьба поделиться Вашими исследованиями.


    1. JetHabr Автор
      03.07.2018 15:11

      Лидером по скорости, несомненно, является LightGBM, после тюна параметров часто тоже. Но в случае, если совсем не задавать гиперпараметры и просто применять алгоритм на данных быстро, то catboost сразу показывает результаты, помогающие оценить порядок точности. Пробовали как на наших датасетах, так и есть исследования Яндекса, например, с конференции Smart Data, там же обещали GPU, но пока новостей не видели.


      1. roryorangepants
        03.07.2018 17:23

        Вам не кажется, что если мы хотим быстро оценить порядок точности, то нам скорость работы важнее, чем то, что CatBoost выжмет лишних полпроцента по сравнению с другими бустингами? Ведь это всё равно грубая оценка.


        1. vpatcera
          03.07.2018 17:47

          У меня катбуст «из коробки» без тюна параметров показывает плачевные результаты на игрушечных датасетах. 20 секунд — серьезно?

          Заголовок спойлера
          image


          1. roryorangepants
            03.07.2018 17:49

            Примерно на это я и намекал. CatBoost медленнее даже xgboost'a, что уж говорить про LightGBM, который ещё быстрее.


            1. JetHabr Автор
              03.07.2018 18:32

              Да по скорости как правило проигрывает, это правда


          1. JetHabr Автор
            03.07.2018 18:31

            В приведенном коде нет задания категориальных переменных — одной из важных «фишек» Кэтбуста. подробное сравнение можно прочитать здесь, например towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db Хотя, конечно, зависит от датасета.


        1. JetHabr Автор
          03.07.2018 18:28

          Это слишком абстрактно — смотря какие порядки. Если разница в несколько минут, то можно и подождать, это сильно быстрее, чем тюнить руками, и отнимает меньше времени.


          1. roryorangepants
            03.07.2018 18:34

            Вы не уловили идею: если мы не будем тюнить, то нам лучше получить результат за 20 секунд, а не за 10 минут, а если мы будем тюнить, то почему не брать сразу LightGBM, который в итоге даст лучше точность?


            1. JetHabr Автор
              04.07.2018 11:06

              Разница не всегда такая большая. Кэтбусту хватает и нескольких минут, и, пока он учится, мы можем заниматься другим.

              Графики AUC vs время обучения в сравнении catboost с другими алгоритмами можно найти в этой презентации от Яндекса assets.ctfassets.net/oxjq45e8ilak/1NtBCBQxXCaAOwy8kumUKu/edccea9c32bdf119e10417367cc85602/_________________________________________CatBoost___________________________________________________________________________.pdf


              1. roryorangepants
                04.07.2018 12:09

                Разница не всегда такая большая. Кэтбусту хватает и нескольких минут, и, пока он учится, мы можем заниматься другим.

                Какая разница, большая она или нет? Для грубой оценки нам всё равно выгоднее взять более быстрый алгоритм (во всяком случае вы пока не назвали ни одного аргумента, почему это не так).

                Графики AUC vs время обучения в сравнении catboost с другими алгоритмами можно найти в этой презентации от Яндекса

                >презентации от Яндекса
                Даже открывать не нужно, чтобы предугадать результаты.


                1. JetHabr Автор
                  04.07.2018 15:03

                  Какая разница, большая она или нет? Для грубой оценки нам всё равно выгоднее взять более быстрый алгоритм (во всяком случае вы пока не назвали ни одного аргумента, почему это не так).

                  Не совсем. При грубой оценке хочется выбирать наиболее приближенный к лучшему значению, если это сравнимо по времени.

                  Если утрировать, то самым быстрым алгоритмом тогда можно взять линейную регрессию и просто решающее дерево, однако это не даст вменяемый потолок.

                  Вопрос в балансе скорости получения результата и адекватности полученного результата. За счет быстроты работы к Lightgbm, например, быстрее подобрать гиперпараметры, однако если просто попробовать, без задания грида и as is, то это может быть не лучшим, т.к. нет уверенности что это не плюс-минус километр (как, например, при применении необученного RandomForest из scikit-learn).


    1. urands
      03.07.2018 16:06

      GPU у катбуста достаточно быстрый, но вероятно у меня не так много оперативки: после завершения активных вычислений он начинает что то активно туда кидать (катбуст затребовал 40 ГБ оперативки): и того 20 мин работы GPU и я ждал 8 часов так и не дождался результата, в итоге решил поберечь свой жесткий диск.


  1. sply
    03.07.2018 20:50
    -1

    У вас немного дезинформации: Torch и PyTorch — это два разных человека. И, собственно, PyTorch — на питоне.


    1. QtRoS
      03.07.2018 21:14

      В какой-то мере Ваш ответ тоже ошибочен. Совсем разными библиотеки тоже назвать нельзя, ядро то же самое (SO)


    1. JetHabr Автор
      04.07.2018 14:05

      Это миграция библиотеки для MatLab Torch на язык питон с сохранением функционала, грубо говоря. В данном обзоре мы рассматривали именно Python с упором на функциональную разницу.


  1. artiom_n
    04.07.2018 16:28

    Добавьте данные по пакетам Matlab пожалуйста, хотя бы по этому пакету, а ещё лучше обзор решений, который вообще для него есть.