На текущий момент Apache Spark считается одним из наиболее популярных фреймворков в мире Big Data, благодаря возможности быстро обрабатывать большие объемы данных. Для специалиста по Data Science он предоставляет следующие преимущества:
- обработка действительно больших объемов данных благодаря распределенной архитектуре и распараллеливанию вычислительных потоков по разделам на разных узлах кластера, который можно масштабировать, добавляя новые машины;
- быстрота вычислений за счет размещения промежуточных результатов MapReduce в оперативной памяти узлов вместо записи на диск, как в классическом Apache Hadoop;
- поддержка популярного в Data Science среде языка программирования Python – PySpark;
- наличие популярных алгоритмов машинного обучения (классификация, регрессия, кластеризация, фильтрация) и средств подготовки данных к моделированию (очистка, извлечение признаков, преобразование и пр.), а также алгебраических и статистических функций. Все это упаковано в специальные пакеты библиотек Machine Learning – MLLib и ML, о которых мы поговорим далее.
НЕМНОГО ИСТОРИИ: КАК В СПАРК ПОЯВИЛИСЬ БИБЛИОТЕКИ MACHINE LEARNING
Работа над библиотекой Mllib стартовала одновременно с разработкой самого Apache Spark, в 2009 году. Благодаря распределенной архитектуре фреймворка, MLlib работал в 9 раз быстрее, чем широко используемая тогда ML-библиотека Apache Mahout. Первая версия MLlib в составе Spark 1.0.0 вышла 30 мая 2014 года [1].
Изначальной структурой данных в Apache Spark был RDD (Resilient Distributed Dataset, надежная распределенная коллекция типа таблицы), на которой позднее были основаны структуры более высокого уровня абстракции – DataFrame и DataSet. Поэтому сперва Spark MLLib работал именно с API RDD, будучи упакован в пакет spark.mllib.
Но современные Spark-разработчики и Data Scientist’ы работают чаще с DataFrame, а не с RDD. Поэтому с версии фреймворка 2.0, выпущенной в 2016 году, основным ML-API в Spark стал DataFrame в пакете spark.ml, а библиотека MLlib на базе RDD перешла в режим обслуживания. Это означает, что в API MLlib на основе RDD больше не добавляются новые функции, хотя пакет spark.mllib входит в состав каждого нового релиза Apache Spark, включая исправления ошибок предыдущих версий.
По сравнению с RDD, DataFrame предоставляет более удобный API, включая единый API для алгоритмов машинного обучения на нескольких языках программирования (Scala, Java, Python, R). Кроме того, датафреймы упрощают прикладную работу с конвейерами Machine Learning, особенно операции преобразования.
Примечательно, что «Spark ML» не является официальным названием библиотеки в пакете spark.ml, но часто используется для обозначения API MLlib на основе DataFrame, чтобы подчеркнуть отличия от предыдущей альтернативы в spark.mllib. При этом официальная документация фреймворка подчеркивает, что оба API поддерживаются и ни один из них не является устаревшим [2].
SPARK MLLIB ВЕРСИИ 3.0: ВАЖНЫЕ УЛУЧШЕНИЯ
Отметим важных несколько зависимостей и улучшений библиотеки MLlib в 3-ей версии Apache Spark. MLlib использует пакеты линейной алгебры Breeze и netlib-java для оптимизации числовой обработки, которые могут вызывать собственные библиотеки ускорения (Intel MKL или OpenBLAS), если они доступны. Но из-за различных лицензий OSS собственные прокси-серверы netlib-java не могут распространяться вместе с Apache Spark. В этом случае придется вручную включить ускоренную обработку линейной алгебры в MLlib. Если этого не сделать, будет использоваться чистая реализация JVM, о чем предупредят следующие сообщения:
- WARN BLAS: Failed to load implementation from:com.github.fommil.netlib.NativeSystemBLAS
- WARN BLAS: Failed to load implementation from:com.github.fommil.netlib.NativeRefBLAS
Чтобы использовать MLlib в Python, понадобится NumPy версии 1.4 или новее.
Из наиболее значимых улучшений и добавлений MLlib Apache Spark 3.0, можно выделить следующие [2]:
- поддержка нескольких столбцов в операторах Binarizer, StringIndexer, StopWordsRemover и PySpark QuantileDiscretizer;
- преобразование функций работы с деревьями решений (случайный лес, градиентные и ансамблевые методы);
- два новых оценщика MultilabelClassificationEvaluator и RankingEvaluator;
- поддержка весов выборки в методах DecisionTreeClassifier/Regressor, RandomForestClassifier/Regressor, GBTClassifier/Regressor, MulticlassificationEvaluator, RegressionEvaluator, BisectingKMeans, KMeans и
- API языка R для PowerIterationClustering;
- слушатель для отслеживания состояния ML-конвейера;
- подгонка валидационного набора к градиентным деревьям в Python;
- преобразователь RobustScaler, который преобразует датасет векторных строк, удаляя медианное значение и масштабируя данные в соответствии с диапазоном квантилей. Он похож на StandardScaler, но вместо среднего и стандартного отклонения используются медиана и квантильный диапазон, что делает его устойчивым к выбросам.
- классификатор и регрессор Factorization Machines, чтобы оценивать взаимодействия между функциями даже в очень специфических задачах, например, в рекомендательной системе. Sml поддерживает машины факторизации для двоичной классификации и регрессии.
- наивный гауссовский байесовский классификатор и дополнительный Naive Bayes Classifier;
- однозначное соответствие функций ML между Scala и Python – удалены разночтений, связанные с тем, что большинство моделей в PySpark не поддерживают методы получения и установки параметров;
- поддержка методов прогнозирования predictRaw и predictProbability на одном экземпляре для моделей классификации, регрессии и кластеризации, кроме LinearSVCModel.
Таким образом, в 3-ей версии фреймворка ML с API Data Frame стал еще лучше и удобнее для специалиста по Data Science и Machine Learning.
Источники