RFormula: Возможности языка R в Spark

Для подготовки датасета и векторизации признаков в 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 в Москве.

Записаться на курс

Смотреть раcписание

Источники
  1. https://spark.apache.org/docs/2.2.0/ml-features.html

Добавить комментарий

Поиск по сайту