检索 Spark Mllib StringIndexer 列映射

Retrieve Spark Mllib StringIndexer column mapping

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

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

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

如何从模型中检索该映射?如果我 serialize/deserialize 模型,映射是否稳定(即我保证在转换后得到相同的结果)?

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|
+------+--------+-------------+