MLlib — это масштабируемая библиотека машинного обучения для Apache Spark, предназначенная для упрощения инженерной практики машинного обучения и облегчения масштабирования до больших наборов данных.
Введение в машинное обучение
Прежде чем погрузиться в Spark MLlib, давайте узнаем о машинном обучении, Согласно Википедии, машинное обучение имеет следующие определения:
Машинное обучение — это наука об искусственном интеллекте, и основным объектом исследования в этой области является искусственный интеллект, в частности, какОпытулучшение в обученииалгоритмизпредставление;
Машинное обучение – этоОпытавтоматически улучшенный компьютералгоритмИсследовательская работа;
Машинное обучение использует данные или прошлоеОпыт, чтобы оптимизировать компьютерную программупредставлениестандартный;
Часто цитируемое определение в английском языке звучит так: «Говорят, что компьютерная программа учится наexperience E with respect to some class of tasks T and performance measureP, если его производительность при выполнении задач в T, измеряемая P, улучшается с опытом E».
Фактически, научно-популярные статьи перед «Командой технологии данных Meitu»Краткий обзор байесовских вероятностных моделейБыло введено, что машинное обучение относится к статистическому машинному обучению в узком смысле Статистическое обучение можно разделить на обучение с учителем, полууправляемое обучение, обучение без учителя и обучение с подкреплением в зависимости от типа задач.
Алгоритмы, обычно используемые в машинном обучении, можно разделить на следующие категории:
1. Построение интервального теоретического распределения:Искусственная нейронная сеть, дерево решений, персептрон, метод опорных векторов, ансамблевое обучение AdaBoost, уменьшение размерности и метрическое обучение, кластеризация, байесовский классификатор;
2. Построить условную вероятность:регрессия гауссовского процесса, линейный дискриминантный анализ, метод ближайших соседей, ядро радиальной базисной функции;
3. Построить функцию плотности вероятности через модель регенерации:алгоритм максимального ожидания, вероятностные графические модели (байесовские сети и марковские случайные поля), генеративное топографическое картографирование;
4. Методы приближенного вывода:Цепи Маркова, методы Монте-Карло, вариационные методы;
5. Алгоритм оптимизации.
Искра MLlib
Выше мы упомянули, что одним из ключевых моментов машинного обучения является «опыт», а для компьютеров опыт часто нужно получать посредством нескольких раундов итерационных вычислений, а Spark хорош в итеративных вычислениях, что в точности соответствует характеристикам машинного обучения. Сравнение производительности алгоритма логистической регрессии на Spark и Hadoop показано на официальном сайте Spark, Из рисунка ниже видно, что MLlib в 100 раз быстрее, чем MapReduce.
Spark MLlib в основном включает следующие аспекты:
Алгоритм обучения:Классификация, регрессия, кластеризация и совместная фильтрация;
Обработка функций:Извлечение признаков, преобразование, уменьшение размерности и выбор;
Трубопровод:Инструменты для создания, оценки и настройки конвейеров машинного обучения;
Упорство:сохранять и загружать алгоритмы, модели и пайплайны;
Утилиты:Инструменты для линейной алгебры, статистики, оптимизации, настройки параметров и т. д.
В приведенной выше таблице обобщается функциональная структура, поддерживаемая Spark MLlib. Видно, что алгоритмы, которые он предоставляет, богаты, но типы алгоритмов немногочисленны и устарели. Поэтому поддержка алгоритмов Spark MLlib несколько оторвана от проекта kylin. функции больше связаны с функцией.
ML Pipelines
Начиная с Spark 2.0, API на основе RDD перешел в режим обслуживания. Основным API Spark для машинного обучения теперь является API на основе DataFrame spark.ml. Основываясь на дизайне Scikit-Learn, он предоставляет пакет Pipeline для создания рабочих процессов машинного обучения. . ML Pipelines предоставляет унифицированный набор высокоуровневых API-интерфейсов, созданных на основе DataFrame, чтобы помочь пользователям создавать и настраивать практические конвейеры машинного обучения.
* «Spark ML» не является официальным названием и иногда используется для обозначения API на основе MLlib DataFrame.
Сначала разберитесь с несколькими важными компонентами конвейеров машинного обучения.
DataFrame
DataFrames дают Spark возможность обрабатывать крупномасштабные структурированные данные.
RDD — это набор распределенных объектов Java, внутренняя структура данных которых не зависит от RDD. DataFrame — это распределенный набор данных, основанный на RDD. Объект Row хранится в RDD, а объект Row предоставляет подробную структурную информацию, а именно схему, которая позволяет DataFrame иметь возможность структурировать данные.
Transforme
Преобразователь обычно представляет собой класс преобразования данных/функций или обученную модель.
Каждый Transformer имеет функцию преобразования, которая преобразует один DataFrame в другой DataFrame. Общий процесс преобразования заключается в добавлении одного или нескольких столбцов во входной DataFrame.Transformer.transform также выполняется лениво, только генерируя новые переменные DataFrame без отправки задания на вычисление содержимого в DataFrame.
Estimator
Estimator абстрагирует процесс обучения модели от входных данных.Каждый Estimator реализует метод подгонки, который используется для создания преобразователя (то есть обученной модели) с учетом DataFrame и параметров.Всякий раз, когда Estimator.fit() вызывается, все будут созданы задания для обучения модели и получения параметров модели.
Param
Параметры модели можно задать, установив параметры экземпляра Transformer или Estimator или передав объект ParamMap.
Pipeline
Конвейер определяет набор процессов обработки данных, и к конвейеру можно добавить преобразователь, оценщик или другой конвейер. Pipeline наследуется от Estimator. После вызова метода Pipeline.fit он возвращает Transformer — PipelineModel; PipelineModel наследуется от Transformer, который используется для преобразования входных данных через каждый Transformer Pipeline для получения окончательного результата.
Типичный поток Spark MLlib выглядит следующим образом:
Создайте обучающий набор данных
Построить каждый этап
Сценическая композиция Pipeline
Начать обучение модели
Оцените производительность модели
Рассчитать результаты прогноза
Углубите свое понимание с помощью примера классификации текста Pipeline:
import org.apache.spark.ml.{Pipeline, PipelineModel}
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.ml.linalg.Vector
import org.apache.spark.sql.Row
// Prepare training documents from a list of (id, text, label) tuples.
val training = spark.createDataFrame(Seq(
(0L, "a b c d e spark", 1.0),
(1L, "b d", 0.0),
(2L, "spark f g h", 1.0),
(3L, "hadoop mapreduce", 0.0)
)).toDF("id", "text", "label")
// Configure an ML pipeline, which consists of three stages: tokenizer, hashingTF, and lr.
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol("words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(10)
.setRegParam(0.001)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, lr))
// Fit the pipeline to training documents.
val model = pipeline.fit(training)
// Now we can optionally save the fitted pipeline to disk
model.write.overwrite().save("/tmp/spark-logistic-regression-model")
// We can also save this unfit pipeline to disk
pipeline.write.overwrite().save("/tmp/unfit-lr-model")
// And load it back in during production
val sameModel = PipelineModel.load("/tmp/spark-logistic-regression-model")
// Prepare test documents, which are unlabeled (id, text) tuples.
val test = spark.createDataFrame(Seq(
(4L, "spark i j k"),
(5L, "l m n"),
(6L, "spark hadoop spark"),
(7L, "apache hadoop")
)).toDF("id", "text")
// Make predictions on test documents.
model.transform(test)
.select("id", "text", "probability", "prediction")
.collect()
.foreach { case Row(id: Long, text: String, prob: Vector, prediction: Double) =>
println(s"($id, $text) --> prob=$prob, prediction=$prediction")
}
Выбор модели и настройка параметров
Spark MLlib предоставляет два инструмента выбора и настройки модели: CrossValidator и TrainValidationSplit. Тремя основными компонентами выбора модели и настройки параметров являются Estimator, ParamGrid и Evaluator.Estimator включает в себя алгоритм или Pipeline, ParamGrid — это коллекция ParamMap, которая обеспечивает пространство для поиска параметров, Evaluator — индекс оценки.
CrossValidator
via https://github.com/JerryLead/blogs/blob/master/BigDataSystems/Spark/ML/Introduction%20to%20MLlib%20Pipeline.md
CrossValidator делит набор данных на n частей по количеству перекрестных проверок, каждый раз использует n-1 часть как обучающую выборку, а остальные как тестовую выборку, обучает и оценивает модель, повторяет n раз, получает n оценок результатов и вычисляет среднее значение, умноженное на n, в результате этой перекрестной проверки. Затем повторите описанный выше процесс для каждого кандидата ParamMap, выберите оптимальный ParamMap и переобучите модель, чтобы получить выходные данные модели с оптимальными параметрами.
? Например:
// We use a ParamGridBuilder to construct a grid of parameters to search over.
// With 3 values for hashingTF.numFeatures and 2 values for lr.regParam,
// this grid will have 3 x 2 = 6 parameter settings for CrossValidator to choose from.
val paramGrid = new ParamGridBuilder()
.addGrid(hashingTF.numFeatures, Array(10, 100, 1000))
.addGrid(lr.regParam, Array(0.1, 0.01))
.build()
// We now treat the Pipeline as an Estimator, wrapping it in a CrossValidator instance.
// This will allow us to jointly choose parameters for all Pipeline stages.
// A CrossValidator requires an Estimator, a set of Estimator ParamMaps, and an Evaluator.
// Note that the evaluator here is a BinaryClassificationEvaluator and its default metric
// is areaUnderROC.
val cv = new CrossValidator()
.setEstimator(pipeline)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(2) // Use 3+ in practice
.setParallelism(2) // Evaluate up to 2 parameter settings in parallel
// Run cross-validation, and choose the best set of parameters.
val cvModel = cv.fit(training)
// Prepare test documents, which are unlabeled (id, text) tuples.
val test = spark.createDataFrame(Seq(
(4L, "spark i j k"),
(5L, "l m n"),
(6L, "mapreduce spark"),
(7L, "apache hadoop")
)).toDF("id", "text")
// Make predictions on test documents. cvModel uses the best model found (lrModel).
cvModel.transform(test)
.select("id", "text", "probability", "prediction")
.collect()
.foreach { case Row(id: Long, text: String, prob: Vector, prediction: Double) =>
println(s"($id, $text) --> prob=$prob, prediction=$prediction")
}
TrainValidationSplit
TrainValidationSplit использует параметр trainRatio для пропорционального разделения обучающей выборки на обучающую и проверочную выборки, где для обучения используется соотношение выборок trainRatio, а для проверки используются оставшиеся выборки.
В отличие от CrossValidator, TrainValidationSplit имеет только один процесс проверки, который можно просто рассматривать как специальную версию CrossValidator, когда n равно 2.
? Например:
import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.ml.tuning.{ParamGridBuilder, TrainValidationSplit}
// Prepare training and test data.
val data = spark.read.format("libsvm").load("data/mllib/sample_linear_regression_data.txt")
val Array(training, test) = data.randomSplit(Array(0.9, 0.1), seed = 12345)
val lr = new LinearRegression()
.setMaxIter(10)
// We use a ParamGridBuilder to construct a grid of parameters to search over.
// TrainValidationSplit will try all combinations of values and determine best model using
// the evaluator.
val paramGrid = new ParamGridBuilder()
.addGrid(lr.regParam, Array(0.1, 0.01))
.addGrid(lr.fitIntercept)
.addGrid(lr.elasticNetParam, Array(0.0, 0.5, 1.0))
.build()
// In this case the estimator is simply the linear regression.
// A TrainValidationSplit requires an Estimator, a set of Estimator ParamMaps, and an Evaluator.
val trainValidationSplit = new TrainValidationSplit()
.setEstimator(lr)
.setEvaluator(new RegressionEvaluator)
.setEstimatorParamMaps(paramGrid)
// 80% of the data will be used for training and the remaining 20% for validation.
.setTrainRatio(0.8)
// Evaluate up to 2 parameter settings in parallel
.setParallelism(2)
// Run train validation split, and choose the best set of parameters.
val model = trainValidationSplit.fit(training)
// Make predictions on test data. model is the model with combination of parameters
// that performed best.
model.transform(test)
.select("features", "label", "prediction")
.show()
Реализовать пользовательский преобразователь
Унаследован от класса Transformer, реализует метод преобразования, обычно добавляя один или несколько столбцов во входной DataFrame.
Для одного входного столбца Transformer с одним выходным столбцом может наследоваться от класса UnaryTransformer и реализовать в нем метод createTransformFunc для обработки каждой строки входного столбца и возврата соответствующего вывода.
Самостоятельно разработанная платформа машинного обучения
Технология машинного обучения меняется с каждым днем, но ей не хватает эффективной и гибкой основы для снижения стоимости исследований новых технологий.Опыт и технологии часто необходимо накапливать с помощью сред и инструментов, а персонал алгоритмов часто ограничен вычислительной мощностью, в результате получаются модели, которые могут оказаться эффективными в автономном режиме. Предполагаемая временная сложность слишком высока для работы в сети.
В соответствии с этим техническая группа Meitu Data создала новый алгоритм с целью «разработки простого и гибкого рабочего процесса машинного обучения, снижения стоимости исследования нового алгоритма для персонала алгоритмов и затрат на обслуживание инженерного персонала, а также предоставления широко используемых решения в этой области для накопления опыта». Набор специально разработанных сред машинного обучения используется для решения вышеуказанных проблем, особенно проблем, возникающих в задачах, связанных с рекомендательными алгоритмами. Всего фреймворк состоит из 3 компонентов: Spark Feature, Bamboo и Online Scorer.
Функция Spark: изготовление обучающего образца
Этот компонент в основном используется для создания обучающих выборок и реализует гибкое и эффективное кодирование признаков выборки.Он может реализовать кодирование любого набора признаков в одном и том же пространстве, а разные наборы признаков совместно используют пространство кодирования.Для этой цели мы предлагаем две концепции : первый — это «домен», который определяет набор функций, которые используют один и тот же процесс моделирования; второй — это «пространство», которое определяет набор доменов, которые используют одно и то же пространство кодирования.
«Старый» в приведенном выше примере показывает пример кодирования признака без понятий «домен» и «пространство», а все признаки нумеруются от 1; «Новый» показывает, что возраст и пол помещены в возрастной домен и гендерный домен соответственно. После этого два поля кодируются соответственно с 1 и не влияют друг на друга.
Spark Feature, наконец, использует TFRecords в качестве формата хранения обучающих образцов.
Бамбук: определение модели и обучение
Этот компонент в основном предназначен для масштабируемого, эффективного, простого и быстрого определения и обучения модели. С этой целью при разработке Bamboo мы следовали следующим принципам:
1.Слои взаимодействуют друг с другом через тензор, вход слоя тензорный, выход тоже тензорный;
2.Чтобы максимизировать эффективность в автономном и онлайн-режиме, не так много продвинутых API, таких как keras, большинство моделей и компонентов разрабатываются на основе базового API Tensorflow, а код оптимизирован в соответствии с официальным руководством Tensorflow по оптимизации производительности;
3.Предоставляется инфраструктура онлайн-офлайн-моделирования, сложные расчеты размещаются в автономном режиме, а в онлайн-режиме выполняются только упрощенные расчеты, что упрощает запуск сложных моделей в онлайн-режиме;
4.Он инкапсулирует загрузку данных, обучение и экспорт модели, оценку эффектов и предоставляет различные вспомогательные инструменты.Пользователям нужно только определить сеть прямого вывода и инкапсулировать большое количество часто используемых слоев, что ускоряет определение модели.
Онлайн-счетчик: служба онлайн-прогнозирования
Цель Online Scorer — предоставить унифицированную и эффективную онлайн-службу вывода, которая может одновременно поддерживать модели, экспортированные различными основными средами моделирования, такими как tensorflow, pytorch и xgboost. В настоящее время эта работа все еще продолжается, и детали конкретного плана реализации будут представлены в следующих специальных статьях.
Вышеизложенное представляет собой краткое введение в самостоятельную разработку платформы машинного обучения Meitu. Вы можете продолжать обращать внимание на «Команду технологии данных Meitu», и в будущем мы представим подробное введение в платформу.