Первоначально опубликовано наhttps://www.niit.com/india/

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

Библиотека Spark для машинного обучения известна как MLlib (библиотека машинного обучения). Он основан на идеях Scikit-learn о конвейерах. Основные понятия для создания модели ML в этой библиотеке:

  • DataFrame: этот API ML использует DataFrame Spark SQL в качестве набора данных ML, который может содержать ряд типов данных. Например, DataFrame может иметь разные столбцы, в которых хранится текст, векторы признаков, истинные метки и прогнозы.
  • Преобразователь: это алгоритм преобразования одного кадра данных в другой. Данные в формате csv, поэтому мы будем использовать библиотеку spark-csv для их загрузки.
  • Оценщик: Оценщик — это алгоритм, который можно использовать для создания преобразователя из кадра данных. Алгоритм обучения, например, представляет собой оценщик, который ориентируется на DataFrame и создает модель.
  • Конвейер: чтобы указать рабочий процесс машинного обучения, конвейер соединяет множество преобразователей и оценщиков.
  • Параметр: для указания параметров все преобразователи и оценщики теперь используют один и тот же API.

Загрузить и проанализировать данные

Чтобы проанализировать данные, сначала нам нужно загрузить данные в Spark. Загрузите файл train.csv, откройте его и проверьте содержимое.

Вы заметите, что файл содержит строку заголовка с PassengerId, Survived, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin и Embarked. Вы можете получить дополнительную информацию о каждом из этих полей на веб-сайте Kaggle. Перенесите этот файл в папку в HDFS (я сохранил свой в /kaggle/titanic/train.csv). Данные в формате csv, поэтому мы будем использовать библиотеку spark-csv для их загрузки.

Мы создадим упрощенную функцию загрузки, которую можно использовать для загрузки CSV-файлов. Сначала запустите свою искровую оболочку, используя следующую команду.

Примечание. Вам придется импортировать некоторые классы для этого проекта.

Процесс учитывает три параметра: путь к CSV-файлу, sqlContext и featureArr, который используется для присвоения имен столбцам по мере их загрузки. В этом случае нам не нужно указывать featureArr, потому что наш CSV-файл включает информацию заголовка. В противном случае именам столбцов были бы присвоены значения по умолчанию, такие как C0, C1 и т. д.

Используйте определенный метод загрузки, чтобы загрузить CSV-файл и создать DataFrame.

Примечание. Мы поддерживаем фрейм данных в памяти, вызывая cache(), это повысит производительность во время построения модели.

Теперь мы рассмотрим загруженный DataFrame, чтобы лучше интерпретировать данные. Мы можем проверить схему загруженных данных, вызвав

Библиотека spark-csv собрала тип данных каждого столбца. Если мы вернемся и проверим метод загрузки, мы увидим, что мы использовали .option("i.option("inferSchema", "true")nferSchema", "true"), что указывает на то, что библиотека делает это. Если не исправить, для всех полей будет задан тип строки. Метод show() в DataFrame можно использовать для демонстрации фрейма данных в табличной форме. Мы также можем передать int этому методу, чтобы проверить, сколько строк должно быть отображено. Например, df.show(100)

Чтобы просмотреть статистику, связанную с любым числовым столбцом, используйте dataFrame.describe("column"). например.,

Предварительная обработка

  • Заполните пропущенные значения

Изучив данные, мы обнаружим некоторые несоответствия. Например, в столбце «Возраст» пропущено несколько значений. Точно так же в Cabin, Fare и Embarked есть нулевые/отсутствующие значения. Существует множество методов заполнения пропущенных значений.

  1. Игнорировать/удалять строки с отсутствующими значениями. Это можно сделать в искре, используя следующее:

2. Если столбец числовой, мы можем заполнить пропущенное значение средним/средним значением столбца. Мы заменим отсутствующие значения в столбце «Возраст», используя следующий метод.

3. Если столбец категоричен, мы можем заполнить его наиболее часто встречающейся категорией.

Примечание. Мы не будем использовать приведенное выше для этого примера. Здесь «Embarked» — это категориальные данные.

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

Откройте для себя новые функции

Во многих ситуациях во входных данных будут функции, которые можно использовать для получения новых функций, которые помогут построить лучшую модель. Это известно как Feature Engineering. Например, мы можем начать извлекать возраст из каждой строки и формировать новый столбец/признак. udf check_infant используется для извлечения группы из заданной строки.

DataFrame представляет метод со столбцом, который можно использовать для добавления/замены существующего столбца. Он принимает два параметра: имя нового столбца и текущий столбец DataFrame.

Теперь мы реализуем функцию check_infant для столбца возраста.

Точно так же мы определим другие udf для создания новых функций.

Компоненты конвейера

Конвейер ML имеет ряд компонентов Pipeline. Преобразователи и оценщики — это два вида компонентов, которые есть. Преобразователи изменяют входной DataFrame в новый DataFrame, используя метод transform(). Оценщик сначала реализует модель для данных, используя метод fit(), а затем выполняет преобразование. Давайте узнаем об этой концепции по следующим компонентам.

Индексатор строк

Все функции в модели Spark должны быть типа Double, однако у нас есть несколько функций типа String. Spark предоставляет преобразователь функций — StringIndexer, который можно использовать для этого преобразования.

StringIndexer — это тип Estimator, который изменяет имя столбца, создает индексы для слов и создает новый столбец под названием Name Rank. Метод Fit объекта StringIndexer преобразует столбец в тип StringType (если это еще не так), а затем оценивает, сколько раз появляется каждое слово. Затем он сортирует эти слова в порядке убывания их повторения и присваивает индекс каждому слову. Метод StringIndexer.fit() возвращает Transformer StringIndexerModel.

.transform() указывает сгенерированный индекс для каждого значения столбца в предоставленном DataFrame.

Обратите внимание, что нам не нужно снова вызывать методы fit() или transform(), об этом позаботится Pipeline. Конвейер будет администрировать каждый этап и передавать результат текущего этапа следующему. Если этап является преобразователем, конвейер вызовет для него transform(), а если это оценщик, то конвейер сначала вызовет fit(), а затем — transform(). Функция transform() не будет вызываться, если Estimator является последней фазой конвейера.

Биннинг/Группирование

Во время биннинга/группирования столбец с последовательными значениями преобразуется в сегменты. При построении Bucketizer, который является преобразователем, мы определяем начальное и конечное значения каждого ведра. Мы собираемся разделить столбец «Возраст».

Векторный ассемблер

VectorAssembler используется для сбора признаков в вектор. Мы предоставим все столбцы, которые нам понадобятся для предсказания, в VectorAssembler, который создаст новый векторный столбец.

Нормализатор

Далее систематизируем данные с помощью преобразователя — Normalizer. Нормализатор возьмет столбец VectorAssembler, нормализует его и создаст новый столбец.

Построение и оценка модели

Мы построим нашу модель, применяя алгоритм LogisticRegression, который используется для классификации. Анализируемая переменная называется зависимой переменной, а другие переменные, которые определяют значение зависимой переменной, называются независимыми переменными.

Логистическая регрессия, основанная на значениях независимых переменных, предсказывает вероятность того, что зависимая переменная примет одно из своих категориальных значений (классов). В нашем случае есть два возможных класса 0 или 1. Чтобы создать компонент LogitsticRegression,

Создать воронку

Используя все компоненты, которые мы объясняли до сих пор, создайте объект конвейера. Как упоминалось выше, конвейер имеет набор этапов, и каждый добавляемый компонент является этапом конвейера. Конвейер будет управлять каждым этапом один за другим, сначала выполняя подгонку (если Evaluator), а затем передавая результат преобразования на следующий этап.

Обучающий и тестовый наборы

Чтобы оценить модель, мы разобьем наши данные на две части — обучающие наборы (80%) и тестовые наборы (20%). Мы создадим нашу модель, используя обучающий набор, и оценим ее с помощью тестового набора. Используйте площадь под ROC-кривой, чтобы сделать вывод о том, насколько хороша модель. Чтобы разделить входные данные,

Теперь конвейер будет использоваться для соответствия нашим обучающим данным. Результатом подгонки конвейера к нашим обучающим данным является объект PipelineModel, который можно использовать для прогнозирования тестовых данных.

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

Чтобы вычислить, насколько хороша модель, выберите столбцы «прогноз» и «выживший» из результата, создайте RDD из [(Double, Double)] и передайте его в BinaryClassificationMetrics.

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

Прогнозирование

Мы можем скачать test.csv с Kaggle и поместить его в HDFS. Тестовые данные (представленные данные) должны пройти все этапы загрузки и предварительной обработки, выполняемые для данных обучения, с дополнительным элементом добавления столбца Выжившие, поскольку test.csv не содержит столбца Выжившие. Загрузка и предварительная обработка тестовых данных такие же, как мы делали выше.

Чтобы сделать прогноз, используйте объект PipelineModel, созданный во время построения модели.

Давайте посмотрим, что наша модель предсказала для первых трех пассажиров в тестовых данных.

Пассажиры с идентификаторами 892 и 894 вряд ли выживут, тогда как ожидается, что пассажир 893 выживет.

Сноска

Библиотека машинного обучения Apache Spark (MLlib) позволяет специалистам по данным сосредоточиться на своих проблемах с данными и моделях, а не решать сложности, связанные с распределенными данными (такими как инфраструктура, конфигурации и т. д.). Apache Spark известен как простой, быстрый и удобный механизм обработки больших данных со встроенными компонентами потоковой передачи, SQL, машинного обучения (ML) и обработки графов. Эта технология востребована инженерами данных, но специалисты по данным могут извлечь выгоду из изучения Spark, выполняя исследовательский анализ данных (EDA), извлечение признаков и, конечно же, машинное обучение. Вы можете лучше понять концепции машинного обучения, выбрав курсы Расширенный PGP в науке о данных и машинном обучении (полный рабочий день) или Расширенный PGP в науке о данных и машинном обучении (неполный рабочий день) от NIIT.