Для подготовки датасета и векторизации признаков в Spark пригодиться класс RFormula. Читайте далее, как векторизовать данные, как записывать формулы, какие операторы поддерживаются, а также как примененять конкатенацию и пересечение с использованием RFormula.
Что такое RFormula в Spark
RFormula служит для извлечения признаков, заданные специальной формулой языка программирования R. В настоящее время в Spark поддерживается ограниченный набор операторов формулы R. К ним относятся:
~
разделяет зависимую (целевую) переменную от независимых+
служит для конкатенации независимых переменных-
удаляет признак, например, «- 1» означает удаление пересечения (intercept):
знак пересечения (умножение числовых значений или бинаризация категориальных значений).
выбор всех столбцов, кроме целевого
Но в Spark НЕ поддерживаются следующие операторы RFormula:
*
служит для взаимодействия (a*b
интерпретируется какa+b+a:b
)^
повторение взаимодействий ((a+b+c)^2
интерпретируется как(a+b+c)*(a+b+c)
)- Математические выражения: вроде log, ln, cos и т. д.
- Специальная функция
I
для проведения арифметических операций (I(b+c)
интерпретируется как суммаb
ис
)
RFormula может пригодиться для векторизации признаков, а также для построения модели линейной регрессии (Linear regression). Обычно для векторизации признаков в Spark требуется несколько шагов, о которых мы говорили тут, но с RFormula можно сделать это за один.
Конкатенация в RFormula
Основным оператором RFormula является конкатенация +
. Предположим, что имеется два столбца a
и b
со значениями double, тогда следующий пример иллюстрирует конкатенацию RFormula в Spark:
y ~ a + b
обозначает модельy = w0 + w1*a + w2*b
, гдеw0
— это точка пересечения (intercept) иw1
,w2
— коэффициенты.
Как и при использовании формул в R для линейной регрессии, строковые данные будут преобразованы в категориальные значения, а числовые данные в числа с плавающей точкой double. Spark для строковых данных создаст объект класса StringIndexer, о котором говорили тут.
Следующий код демонстрирует применение конкатенации RFormula в Spark:
from pyspark.ml.feature import RFormula dataset = spark.createDataFrame( [(7, "US", 18, 1.0), (8, "CA", 12, 0.0), (9, "NZ", 15, 0.0)], ["id", "country", "hour", "clicked"]) formula = RFormula( formula="clicked ~ country + hour", featuresCol="features", labelCol="label") output = formula.fit(dataset).transform(dataset) output.select("features", "label").show()
+--------------+-----+ | features|label| +--------------+-----+ |[0.0,0.0,18.0]| 1.0| |[1.0,0.0,12.0]| 0.0| |[0.0,1.0,15.0]| 0.0| +--------------+-----+
Первые два признака в получившемся столбце features отвечают за категориальный признак country. Результат векторизации можно скормить одному из Machine Learning алгоритмов в Spark.
Пересечение в RFormula
Rformula может провести операцию пересечения в Spark над столбцами с числами с плавающей точкой. Так, например:
y ~ a + b + a:b - 1
означаетy = w1*a + w2*b + w3*a*b
, где w1, w2, w3 — коэффициенты (intercept был исключен с помощью добавления «-1»)
Возвращаясь к предыдущему код в Spark, продемонстрируем применение пересечения RFormula:
formula = RFormula( formula="clicked ~ hour + id + hour:id", featuresCol="features", labelCol="label") output = formula.fit(dataset).transform(dataset) output.select("features", "label").show()
+----------------+-----+ | features|label| +----------------+-----+ |[18.0,7.0,126.0]| 1.0| | [12.0,8.0,96.0]| 0.0| |[15.0,9.0,135.0]| 0.0| +----------------+-----+
Последний признак — это результат умножения id на hour.
Выбор всех столбцов
Если предварительно подготовлены и обработаны все столбцы вашего датасета, и необходимо только их векторизовать, то пригодится выбор всех столбцов, кроме целевого. Код Spark для векторизации всех столбцов датасета с использование RFormula выглядит следующим образом:
formula = RFormula( formula="clicked ~ .", featuresCol="features", labelCol="label") output = formula.fit(dataset).transform(dataset) output.select("features", "label").show()
+------------------+-----+ | features|label| +------------------+-----+ |[7.0,0.0,0.0,18.0]| 1.0| |[8.0,1.0,0.0,12.0]| 0.0| |[9.0,0.0,1.0,15.0]| 0.0| +------------------+-----+
А о том, как подготавливать датасеты, векторизовывать признаки и обучать модели машинного обучения в Spark для решения реальных задач Big Data, вы узнаете на специализированном курсе «Анализ данных с Apache Spark» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.