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,依此类推...
如何从模型中检索该映射?如果我对模型进行序列化/反序列化,映射是否将是稳定的(即,在转换后是否可以保证获得相同的结果)?
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)