Искра RFormula Интерпретация - PullRequest
0 голосов
/ 18 апреля 2020

Я читал «Spark The Definition Guide», я наткнулся на раздел кода в главе MLlib, в котором есть следующий код:

var df = spark.read.json("/data/simple-ml") 
df.orderBy("value2").show()
import org.apache.spark.ml.feature.RFormula
// Unable to understand the interpretation of this formulae
val supervised = new RFormula().setFormula("lab ~ . + color:value1 + color:value2")
val fittedRF = supervised.fit(df)
val preparedDF = fittedRF.transform(df) 
preparedDF.show()

Где / data / simple-ml содержит файл JSON содержащий (например): -

"lab": "good", "color": "green", "value1": 1, "value2": 14.386294994851129 "lab": "bad", "color" : "blue", "value1": 8, "value2": 14.386294994851129 "lab": "bad", "color": "blue", "value1": 12, "value2": 14.386294994851129 "lab": "good" , "color": "green", "value1": 15, "value2": 38.9718713375581

Вы можете найти полный набор данных в https://github.com/databricks/Spark-The-Definitive-Guide/blob/master/data/simple-ml/part-r-00000-f5c243b9-a015-4a3b-a4a8-eca00f80f04c.json, и строки выше выводят как : -

[зеленый, хороший, 1,14.386294994851129, (10, [0,2,3,4,7], [1.0,1.0,14.386294994851129,1.0,14.386294994851129]), 0,0] [Синий, плохой, 8,14.386294994851129 (10, [2,3,6,9], [8.0,14.386294994851129,8.0,14.386294994851129]) 1,0] [Синий, плохой, 12,14.386294994851129, (10, [2,3,6,9], [12.0,14.386294994851129,12.0,14.386294994851129]) 1,0] [Зеленый, хорошо, 15,38.97187133755819, (10, [0,2,3,4,7], [1.0,15.0,38.97187133755819,15.0,38.97187133755819]) , 0,0]

Теперь я не могу понять, как он вычисляет значение 5-го (выделено жирным шрифтом) столбца.

1 Ответ

1 голос
/ 18 апреля 2020

5-й столбец - это структура, представляющая разреженные векторы в Spark. Он состоит из трех компонентов:

  • длина вектора - в этом случае все векторы имеют длину 10 элементов
  • массив индексов, содержащий индексы ненулевых элементов
  • значение массив ненулевых значений

Итак

(10,[0,2,3,4,7],[1.0,1.0,14.386294994851129,1.0,14.386294994851129])

представляют следующий разреженный вектор длины 10 (возьмите i -ое значение и поместите его в position i ):

 0       2    3                   4          7
[1.0, 0, 1.0, 14.386294994851129, 1.0, 0, 0, 14.386294994851129, 0, 0]

(показаны позиции ненулевых элементов)

Каковы отдельные компоненты этого вектора? Согласно документации :

RFormula создает векторный столбец объектов и двойной или строковый столбец метки. Как и при использовании формул в R для линейной регрессии, строковые столбцы ввода будут кодироваться в горячем виде, а числовые столбцы c будут приводиться к двойным значениям. Если столбец метки имеет тип string, он сначала преобразуется в double с StringIndexer. Если столбец метки не существует в DataFrame, столбец выходной метки будет создан из указанной переменной ответа в формуле.

lab ~ . + color:value1 + color:value2 - это специальный синтаксис, который исходит от языка R. Он описывает модель, которая регрессирует значение lab для всех других функций плюс два термина взаимодействия (продукта). Вы можете увидеть список всех функций, напечатав fittedRF и посмотрев экземпляр ResolvedRFormula, в котором он содержится:

scala> println(fittedRF)
RFormulaModel(
 ResolvedRFormula(
  label=lab,
  terms=[color,value1,value2,{color,value1},{color,value2}],
  hasIntercept=true
 )
) (uid=rFormula_0847e597e817)

Я разбил вывод по строкам и отступ для удобства чтения. Таким образом, . + color:value1 + color:value2 расширяется до [color,value1,value2,{color,value1},{color,value2}]. Из них color является категориальной функцией и кодируется в горячем виде в наборе функций индикатора с использованием следующего сопоставления:

  • зеленый становится [1, 0]
  • синий становится [0, 0]
  • красный становится [0, 1]

Хотя у вас есть три категории, только две используется для кодирования. Синий в этом случае отбрасывается, поскольку его присутствие не имеет никакого информационного значения - если оно было там, все три столбца всегда будут суммироваться в 1, что делает их линейно зависимыми. Эффект отбрасывания категории blue состоит в том, что она становится базовой линией в качестве части перехвата, и подобранная модель предсказывает, какой эффект изменяет категорию с blue на green или от синий до красный будет на этикетке. Этот конкретный выбор кодировки немного произвольный - в моей системе столбцы для red и green поменялись местами.

value1 и value2 - двойные , поэтому они go неизменны в векторе признаков. {color,value1} является продуктом функции color и функции value1, так что это продукт кодирования color в одно касание со скалярным value1, в результате чего появилось три новых функции. Обратите внимание, что в этом случае мы не можем отбросить одну категорию, потому что взаимодействие делает «базовое» значение зависимым от значения второго объекта во взаимодействии. То же самое для {color,value2}. Таким образом, в итоге вы получите 2 + 1 + 1 + 3 + 3 или 10 функций. В выводе show() вы видите собранный столбец векторных объектов, который может использоваться в качестве входных данных другими классами Spark ML.

Вот как читать первую строку:

(10,[0,2,3,4,7],[1.0,1.0,14.386294994851129,1.0,14.386294994851129])

- это разреженное векторное представление

[1.0, 0, 1.0, 14.386294994851129, 1.0, 0, 0, 14.386294994851129, 0, 0]
 |--1--| |2|  |-------3--------|  |---4---|  |----------5-----------|

, которое содержит следующие отдельные компоненты:

  1. [1.0, 0, ...] - color, кодирование в "горячем" режиме (минус линейно-зависимое кодирование) третья категория) зеленый
  2. [..., 1.0, ...] - value1, значение 1
  3. [..., 14.386294994851129, ...] - value2, значение 14 38629 .. .
  4. [..., 1.0, 0, 0, ...] - color x value1 член взаимодействия, продукт кодирования одной горячей строки: зеленый ([1, 0, 0]) и 1
  5. [..., 14.386294994851129, 0, 0] - color x value2 термин взаимодействия, произведение однократного кодирования зеленый ([1, 0, 0]) и 14 38629 ...
...