检索 Spark Mllib StringIndexer 列映射

Posted

技术标签:

【中文标题】检索 Spark Mllib StringIndexer 列映射【英文标题】:Retrieve Spark Mllib StringIndexer column mapping 【发布时间】:2017-04-23 19:09:47 【问题描述】:

如何从经过训练的 Spark MLlib StringIndexerModel 中获取映射?

val stringIndexer = new StringIndexer()
    .setInputCol("myCol")
    .setOutputCol("myColIdx")
val stringIndexerModel = stringIndexer.fit(data)
val res = stringIndexerModel.transform(data)

上面的代码将在myCol 中的我的DataFrame 映射值中添加一个myColIdx,并将其添加到基于值频率的索引中。即最频繁的值 -> 0,第二频繁的值 -> 1,等等......

如何从模型中检索该映射?如果我对模型进行序列化/反序列化,映射是否稳定(即,我是否保证在转换后得到相同的结果)?

【问题讨论】:

【参考方案1】:

StringIndexerModel 使用 labels 属性公开映射:

stringIndexerModel.labels: Array[String]

其中值对应于连续标签,例如:

val data = Seq("foo", "bar", "foo", "bar", "foobar", "bar").toDF("myCol")

你会关注labels:

import org.apache.spark.ml.feature.IndexToString

Array(bar, foo, foobar)

bar 索引为 0.0,foo 索引为 1.0,foobar 索引为 2.0。这是模型的属性,当模型为saved时保留。

Pipeline 中使用时,您还可以使用IndexToString,它将使用列元数据将索引映射回标签。

indexToString.transform(stringIndexerModel.transform(data)).show
+------+--------+-------------+
| myCol|myColIdx|myColReversed|
+------+--------+-------------+
|   foo|     1.0|          foo|
|   bar|     0.0|          bar|
|   foo|     1.0|          foo|
|   bar|     0.0|          bar|
|foobar|     2.0|       foobar|
|   bar|     0.0|          bar|
+------+--------+-------------+

【讨论】:

以上是关于检索 Spark Mllib StringIndexer 列映射的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

14.spark mllib之快速入门

学习笔记Spark—— Spark MLlib应用—— 机器学习简介Spark MLlib简介

学习笔记Spark—— Spark MLlib应用—— 机器学习简介Spark MLlib简介

Spark ML 和 MLLIB 包有啥区别

Spark-Mllib基本统计