Последнее время язык Scala стал обширно применяться специалистами Data Science. Он приобрел популярность в основном благодаря появлению Spark, который написан на Scala. На практике, часто на этапе исследования анализ и создание модели выполняются в Python, а затем реализуются в Scala, поскольку этот язык больше подходит для production.
Мы подготовили подробный обзор наиболее интересных библиотек, используемых для реализации задач машинного обучения и data science в Scala. Часть из них используется в нашей образовательной программе "Анализ данных на Scala".
Для удобства все представленные в рейтинге библиотеки были разделены на 5 групп: анализ данных и математика, NLP, визуализация, машинное обучение и прочее.
Анализ данных и математика
№1. Breeze (Коммиты: 3316, Контрибьютеры: 84)
Библиотека Breeze известна как основная научная библиотека для Scala. В ней есть похожие вещи из MATLAB (с точки зрения структур данных), а из Python – классы NumPy. Breeze обеспечивает быстрые и эффективные манипуляции с массивами данных и позволяет выполнять многие другие операции, включая следующие:
- Матричные и векторные операции для создания, транспонирования, выполнения поэлементных операций, инверсии, вычисления определителей и многих других вещей.
- Вероятностные и статистические функции: от статистических распределений и вычисления описательных статистик (таких как среднее значение, дисперсия и стандартное отклонение) до моделей цепей Маркова. Основными пакетами для статистики являются breeze.stats и breeze.stats.distributions.
- Оптимизация, которая подразумевает исследование функции для локального или глобального минимума. Методы оптимизации хранятся в пакете breeze.optimize.
- Линейная алгебра: все основные операции основаны на библиотеке netlib-java, что делает Breeze чрезвычайно быстрым для алгебраических вычислений.
- Операции по обработке сигналов. Примерами таких операций в Breeze являются свертка и преобразование Фурье, которое разбивает данную функцию на сумму компонентов синуса и косинуса.
Стоит отметить, что Breeze также позволяет строить графики, но об этом поговорим позже.
№2. Saddle (Коммиты: 184, Контрибьютеры: 10)
Другой инструмент для работы с данными для Scala – Saddle. Это аналог Pandas в Python, но только для Scala. Как и датафреймы в Pandas или R, Saddle основана на структуре фрэймов (двумерная индексированная матрица).
Всего существует пять основных структур данных, а именно:
Vec (1D вектор)
Mat (2D матрица)
Series (1D индексированная матрица)
Frame (2D индексированная матрица)

- Index (в виде hashmap)
Классы Vec и Mat расположены в Series и Frame. Вы можете осуществлять различные манипуляции с этими структурами данных и использовать их для базового анализа данных. Еще одна замечательная особенность Saddle – его устойчивость к пропускам в данных.
№3. ScalaLab (Коммиты: 23, Контрибьютеры: 1)
ScalaLab – это своего рода MATLAB в Scala. Более того, ScalaLab может напрямую вызывать и получать доступ к результатам скриптов MATLAB.
Основное отличие от предыдущих вычислительных библиотек состоит в том, что ScalaLab использует свой собственный предметно-ориентированный язык, называемый ScalaSci. Scalalab удобен тем, что получает доступ к множеству научных библиотек Java и Scala, поэтому можно легко импортировать свои данные и затем использовать различные методы для выполнения манипуляций и вычислений. Большинство вещей похожи на Breeze и Saddle. Более того, как и в Breeze, существуют возможности построения графиков, которые позволяют дополнительно интерпретировать полученные данные.
NLP
№4. Epic (Коммиты: 1790, Контрибьютеры: 15) и Puck (Коммиты: 536, Контрибьютеры: 1)
Scala имеет несколько хороших библиотек обработки естественного языка в составе ScalaNLP, включая Epic и Puck. Эти библиотеки в основном используются в качестве инструментов анализа текстов. При этом Puck более удобен, если необходимо анализировать тысячи предложений из-за его высокой скорости и использования графического процессора. Кроме того, Epic известен как фреймворк прогнозирования, который использует структурированное прогнозирование для построения сложных систем.
Визуализация
№5. Breeze-viz (Коммиты: 29, Контрибьютеры: 3)
Как следует из названия, Breeze-viz – это библиотека для визуализации, разработанная Breeze для Scala. Он основан на известной библиотеке Java JFreeChart и создание графиков чем-то похоже на MATLAB. Хотя Breeze-viz имеет гораздо меньше возможностей, чем MATLAB, matplotlib в Python или R, тем не менее полезна при создании моделей и анализе данных.

№6. Vegas (Коммиты: 210, Контрибьютеры: 14)
Еще одна библиотека Scala для визуализации данных – это Vegas. Она гораздо более функциональная, чем Breeze-viz, и позволяет делать некоторые преобразования, полезные для графиков: фильтрацию, трансформации и агрегации. В целом, библиотека похожа на Bokeh и Plotly в Python.
Vegas позволяет писать код в декларативном стиле, что дает возможность сосредоточиться главным образом на определении того, что необходимо сделать с данными, и проведении дальнейшего анализа визуализаций, не беспокоясь об имплементации кода.

Машинное обучение
№7. Smile (Коммиты: 1019, Контрибьютеры: 21)
Statistical Machine Intelligence and Learning Engine или же просто Smile – является многообещающей современной библиотекой машинного обучения, в чем-то похожей на scikit-learn в Python. Он разработан на Java, но у него также есть API для Scala. Библиотека достаточно быстрая и производительная: эффективное использование памяти, большой набор алгоритмов машинного обучения для классификации, регрессии, NNS, выбора функций и т. д.


№8. Spark ML
Библиотека машинного обучения, которая работает из коробки в Apache Spark. Сам Spark написан на Scala и имеет соответствующее API для всех своих библиотек.
Spark ML – в отличие от Spark MLlib (более старой библиотеки), работает с датафрэймами. Также она дает возможность строить пайплайны различных преобразований на ваших данных. Это может рассматриваться как последовательность этапов, где каждый этап представляет собой либо Transformer, который преобразует один датафрейм в другой, либо Estimator, например, алгоритм машинного обучения, который обучается на датафрейме.
№9. DeepLearning.scala (Коммиты: 1647, Контрибьютеры: 14)
DeepLearning.scala – это альтернативный инструмент машинного обучения, который позволяет строить модели deep learning. Библиотека использует математические формулы для создания сложных динамических нейронных сетей посредством комбинации объектно-ориентированного и функционального программирования. Она использует широкий спектр типов, а также классы аппликативных типов. Последнее позволяет начинать несколько вычислений одновременно, что повышает производительность.
№10. Summing Bird (Коммиты: 1772, Контрибьютеры: 31)
Summingbird – это фреймворк обработки данных, который позволяет использовать batch и real-time MapReduce-вычисления. Основным катализатором для разработки языка стали разработчики Twitter, которые часто занимались написанием одного и того же кода дважды: сначала для батчевой обработки, затем еще раз для стриминга.
Summingbird использует и генерирует два типа данных: потоки (бесконечные последовательности кортежей) и снэпшоты, которые в определенный момент времени считаются полным состоянием набора данных. Наконец, Summingbird предоставляет платформу для Storm, Scalding и движок для вычислений в памяти для целей тестирования.
№11. PredictionIO (Коммиты: 4343, Контрибьютеры: 125)
Стоит также упомянуть сервис машинного обучения для создания и развертывания прогностических механизмов, называемых PredictionIO. Он построен на Apache Spark MLlib и HBase и даже был оценен на Github как самый популярный продукт машинного обучения на основе Apache Spark. Он позволяет вам легко и эффективно создавать, оценивать и развертывать сервисы, реализовывать свои собственные модели машинного обучения и включать их в свой сервис.
Прочее
№12. Akka (Коммиты: 21430, Контрибьютеры: 467)
Akka, разработанная компанией-разработчиком Scala, представляет собой параллельную среду для построения распределенных приложений на JVM. Она использует модель на основе акторов (actor), где актор представляет собой объект, который получает сообщения и выполняет соответствующие действия.
Основным отличием является дополнительный уровень между акторами и фреймворком, который требует только, чтобы акторы обрабатывали сообщения, в то время как фреймворк берет на себя обработку всего остального. Все акторы иерархически организованы, это помогает акторам более эффективно взаимодействовать друг с другом и решать сложные проблемы, разделяя их на более мелкие задачи.
№13. Slick (Коммиты: 1940, Контрибьютеры: 92)
Последняя библиотека – Slick, что означает Scala Language-Integrated Connection Kit. Это библиотека для создания и выполнения запросов к базам данных: H2, MySQL, PostgreSQL и т. д. Некоторые базы данных доступны через расширения slick-extensions.
Для построения запросов Slick предоставляет мощный DSL, который делает код таким, как если бы вы использовали коллекции Scala. Slick поддерживает как простые запросы SQL, так и строго типизированные джойны нескольких таблиц. Кроме того, простые подзапросы могут использоваться для создания более сложных.
Заключение
В этой статье мы выделили и кратко описали некоторые библиотеки Scala, которые могут быть очень полезны при выполнении основных задач по обработке данных.
Если у вас есть опыт работы с любыми другими полезными библиотеками или платформами Scala, которые стоит добавить в этот список, пожалуйста, не стесняйтесь делиться ими в комментариях.