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 将在标签上。编码的特定选择有点随意 - 在我的系统上 red 和 green 的列交换了。
value1
和 value2
是双精度数,因此它们在特征向量中保持不变。 {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.0, 0, ...]
- color
,类别green 的one-hot编码(减去线性相关的第三类)
[..., 1.0, ...]
- value1
, 值 1
[..., 14.386294994851129, ...]
- value2
, 值 14,38629...
[..., 1.0, 0, 0, ...]
- color x value1
交互项,green ([1, 0, 0]
) 和 1[=104= 的单热编码的乘积]
[..., 14.386294994851129, 0, 0]
- color x value2
交互项,green ([1, 0, 0]
) 和 14,38629.. .
我正在阅读 "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 将在标签上。编码的特定选择有点随意 - 在我的系统上 red 和 green 的列交换了。
value1
和 value2
是双精度数,因此它们在特征向量中保持不变。 {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.0, 0, ...]
-color
,类别green 的one-hot编码(减去线性相关的第三类)
[..., 1.0, ...]
-value1
, 值1
[..., 14.386294994851129, ...]
-value2
, 值 14,38629...[..., 1.0, 0, 0, ...]
-color x value1
交互项,green ([1, 0, 0]
) 和 1[=104= 的单热编码的乘积][..., 14.386294994851129, 0, 0]
-color x value2
交互项,green ([1, 0, 0]
) 和 14,38629.. .