Spark RFormula 解释

Spark RFormula Interpretation

我正在阅读 "Spark The Definitive 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 个(以粗体标记)列值的。

第 5 列是表示 Spark 中稀疏向量的结构。它包含三个组成部分:

  • 向量长度 - 在这种情况下,所有向量的长度都是 10 个元素
  • 包含非零元素索引的索引数组
  • 非零值数组

所以

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

表示以下长度为10的稀疏向量(取第i个值并将其放在i位置):

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

(显示非零元素的位置)

该向量的各个组成部分是什么?根据 documentation:

RFormula produces a vector column of features and a double or string column of label. Like when formulas are used in R for linear regression, string input columns will be one-hot encoded, and numeric columns will be cast to doubles. If the label column is of type string, it will be first transformed to double with StringIndexer. If the label column does not exist in the DataFrame, the output label column will be created from the specified response variable in the formula.

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]

虽然你有三个类别,但只有两个用于编码。 Blue 在这种情况下被丢弃,因为它的存在没有信息价值 - 如果它在那里,所有三列总和为 1,这使它们线性相关。删除 blue 类别的效果是它成为基线作为截距的一部分,并且拟合模型预测从 blue 改变类别的效果to green or from blue to red 将在标签上。编码的特定选择有点随意 - 在我的系统上 redgreen 的列交换了。

value1value2 是双精度数,因此它们在特征向量中保持不变。 {color,value1}color 特征和 value1 特征的乘积,因此这是 color 的单热编码与标量 value1 的乘积,产生了三个新特征。请注意,在这种情况下,我们不能删除一个类别,因为交互使 "base" 值依赖于交互中第二个特征的值。 {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,类别green
  2. 的one-hot编码(减去线性相关的第三类)
  3. [..., 1.0, ...] - value1, 值 1
  4. [..., 14.386294994851129, ...] - value2, 值 14,38629...
  5. [..., 1.0, 0, 0, ...] - color x value1 交互项,green ([1, 0, 0]) 和 1[=104= 的单热编码的乘积]
  6. [..., 14.386294994851129, 0, 0] - color x value2 交互项,green ([1, 0, 0]) 和 14,38629.. .