检索Spark Mllib StringIndexer列映射

Mar*_*ace 3 scala apache-spark apache-spark-ml apache-spark-mllib

如何从训练有素的Spark MLlib StringIndexerModel中获取映射?

val stringIndexer = new StringIndexer()
    .setInputCol("myCol")
    .setOutputCol("myColIdx")
val stringIndexerModel = stringIndexer.fit(data)
val res = stringIndexerModel.transform(data)
Run Code Online (Sandbox Code Playgroud)

上面的代码将根据值的频率myColIdx向我的DataFrame映射值添加一个myCol索引。例如,最频繁的值-> 0,第二个最频繁的-> 1,依此类推...

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

use*_*411 6

StringIndexerModel使用labels属性公开映射:

stringIndexerModel.labels: Array[String]
Run Code Online (Sandbox Code Playgroud)

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

val data = Seq("foo", "bar", "foo", "bar", "foobar", "bar").toDF("myCol")
Run Code Online (Sandbox Code Playgroud)

您将获得以下信息labels

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

Array(bar, foo, foobar)
Run Code Online (Sandbox Code Playgroud)

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

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

indexToString.transform(stringIndexerModel.transform(data)).show
Run Code Online (Sandbox Code Playgroud)
+------+--------+-------------+
| 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|
+------+--------+-------------+
Run Code Online (Sandbox Code Playgroud)