Разработка признаков перед вводом данных в модели Spark ML.

Введение

Apache Spark — это мощный инструмент с открытым исходным кодом для крупномасштабной обработки данных и моделирования. PySpark позволяет писать искровые приложения с использованием API-интерфейсов Python. Он предоставляет встроенную библиотеку машинного обучения (MLlib), которую можно использовать для создания масштабируемых моделей машинного обучения.

В этой статье основное внимание уделяется этапам подготовки данных, которые необходимо выполнить перед вводом данных в модели машинного обучения. В целом подготовка включает в себя сборку отдельных переменных в единый вектор признаков с помощью VectorAssembler в Spark. VectorAssembler принимает список столбцов в качестве входных данных и объединяет их в один векторный столбец. Это полезно для объединения различных необработанных, а также сгенерированных / преобразованных функций в единый вектор функций, который затем можно использовать для моделирования.

Цель

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

В этой статье конкретно рассматриваются:

  • Создание образца искрового фрейма данных
  • Использование VectorAssembler, когда доступны только числовые функции
  • Использование VectorAssembler, когда доступны как числовые, так и категориальные функции

Поток обработки данных

Во-первых, давайте посмотрим на процесс обработки данных высокого уровня в моделировании PySpark. Как показано на рис. 1 ниже, он начинается с приема данных, за которым следует исследовательский анализ данных, разработка функций, создание окончательных данных и их разделение на обучение, тестирование и проверку для целей моделирования. В этой статье мы сосредоточимся на том, как мы можем перейти от разработки признаков к шагам VectorAssembler.

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

Прежде чем углубляться в детали, давайте посмотрим на высокоуровневый процесс сборки отдельной переменной в векторный столбец «признаки». На рис. 2 показано, как две числовые переменные X1 и X2 объединяются с помощью VectorAssembler в один векторный столбец, который называется «функции». В последующих разделах мы сосредоточимся на том, как можно перейти от отдельных переменных к векторизованной форме, как указано в столбце «функции» на рисунке ниже.

Сценарий 1: VectorAssembler: числовые характеристики

Начнем с VectorAssembler, когда в данных доступны только числовые признаки. Код ниже создает искровой фрейм данных «customerdata» с тремя столбцами; «cust_id», «monthly_payment» и «tenure_yrs». И «ежемесячный_платеж», и «время_года» являются числовыми характеристиками.

customerdata = spark.createDataFrame(
 [
 (1, 29.99, 5),
 (2, 31.99, 3),
 (3, 24.99, 1),
 (4, 21.99, 3),
 ],[“cust_id”, ‘monthly_payment’, ‘tenure_yrs’]
)
customerdata.show(3)

Импортируйте VectorAssembler из pyspark.ml.feature . VectorAssembler объединяет все переменные в один столбец. Давайте назовем это «функциями», как показано ниже.

from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
    inputCols=["monthly_payment", "tenure_yrs"],
    outputCol="features")
outdata = assembler.transform(customerdata)
outdata.show(10, truncate=False)

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

Сценарий 2: VectorAssembler: числовые + категориальные признаки

Ниже я создал искровой фрейм данных «customerdata1», состоящий из числовых (monthly_payment и tenure_yrs) и категориальных (состояние) переменных. Переменная состояния содержит 3 типа: MD, VA и WA.

customerdata1 = spark.createDataFrame(
 [
 (1, 29.99, 5, ‘MD’),
 (2, 31.99, 3, ‘MD’),
 (3, 24.99, 1, ‘VA’),
 (4, 21.99, 3, ‘WA’),
 (5, 22.00, 3, ‘WA’),
 (6, 25.00, 7, ‘WA’),
 ],
 [“cust_id”, ‘monthly_payment’, ‘tenure_yrs’, ‘state’]
)
customerdata1.show(10, truncate=False)

Когда у нас есть категориальная переменная в данных, требуется немного больше работы. Первым шагом здесь является изменение категории на число, что достигается с помощью StringIndexer, доступного в pyspark.ml.feature. StringIndexer присваивает уникальные значения каждой категории переменной.

Когда применяется StringIndexer, наиболее часто встречающаяся категория получает индекс 0, затем 1 для следующей по частоте категории и так далее. Ниже состояние: WA получает индекс 0, поскольку это наиболее часто встречающаяся категория в состоянии, за которой следуют MD:1 и VA:2.

Давайте импортируем необходимые функции и применим StringIndexer. StringIndexer принимает два аргумента inputCol и outputCol.

from pyspark.ml.feature import (StringIndexer, OneHotEncoder, VectorAssembler)
indexer = StringIndexer(inputCol=’state’, outputCol=’stateNum’)
indexd_data=indexer.fit(customerdata1).transform(customerdata1)
indexd_data.show(10, truncate=False)

Как показано выше, создается переменная StateNum, которая имеет числовое представление для каждого из состояний (MD:1, VA:2 и WA:0). Как указывалось ранее, WA индексируется как 0, потому что это наиболее частое состояние (3 раза), за ним следуют MD (2 раза) и VA (1 раз).

Затем мы используем OneHotEncoder для кодирования индексированной переменной (stateNum) и, наконец, используем VectorAssembler для сборки всех числовых и одного горячего векторов вместе. Выходные данные OneHotEncoder(stateVec) показаны ниже.

encoder = OneHotEncoder(inputCol=’stateNum’, outputCol = ‘stateVec’)
onehotdata = encoder.fit(indexd_data).transform(indexd_data)
onehotdata.show(10, truncate=False)

OneHotEcnoder создает фиктивные переменные для каждой категории. В нашем случае состояние имеет 3 категории: MD, VA и WA. При использовании OneHotEncoder эти 3 категории представлены двумя столбцами (векторами). Один горячий кодировщик выводит n-1 векторов, где n — количество категорий в признаке (n = 3, в нашем случае для состояния). Один вектор горячего кодирования захватывает количество векторов, значение, содержащееся в векторе, и положение значения. Давайте подробнее рассмотрим stateVec для MD, то есть (2,[1],[1.0]). Он представляет собой 2 вектора (3 состояния -1) со значением 1, т.е. [1.0] в позиции 1.

Теперь, когда мы преобразовали категориальный признак в числовую форму, нам нужно собрать все входные столбцы, включая этот преобразованный, в единый вектор, называемый «признаками». Для этой цели мы используем VectorAssembler, который принимает два аргумента inputCols (для всех входных данных) и outputCol (имя выходного столбца).

assembler1 = VectorAssembler(
 inputCols=[“cust_id”, “monthly_payment”, “tenure_yrs”, “stateVec”],
 outputCol=”features”)
outdata1 = assembler1.transform(onehotdata)
outdata1.show(10, truncate=False)

Как показано на рис. 8, выходные данные содержат все входные данные, которые мы предоставили в inputCols, включая outputCol, т. е. столбец «features» (вывод из VectorAssembler). Столбец «функции» включает в себя все столбцы, собранные в нем. Далее, для последующего использования, такого как обучение, тестовое разделение и моделирование, мы используем только столбец «функции» в качестве входных данных.

Краткое содержание

Для моделирования PySpark необходимо подготовить данные с помощью VectorAssembler, который содержит все числовые признаки и векторные преобразованные категориальные признаки. StringIndexer и OneHotEncoder, доступные в pyspark.ml.feature, являются важными шагами для преобразования категориальной переменной в векторизованную форму, которую затем можно использовать для последующего моделирования. работа.

Рад, что вы дочитали до сих пор! Благодарю вас за то, что вы уделили время чтению, и надеюсь, что это немного помогло вам понять процесс подготовки данных для моделирования PySpark. Пожалуйста, оставьте, если какие-либо комментарии или предложения.

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

Счастливого обучения!!!