如何将Spark中的分类变量转换为一组编码为{0,1}的列?

Spa*_*ser 7 scala bigdata categorical-data apache-spark apache-spark-mllib

我正在尝试使用Spark MLlib(带Scala)对包含分类变量的数据集执行逻辑回归(LogisticRegressionWithLBFGS).我发现Spark无法使用这种变量.

在R中有一种处理这类问题的简单方法:我在因子(类别)中转换变量,因此R创建一组编码为{0,1}指标变量的列.

我怎样才能用Spark执行此操作?

xma*_*mar 5

使用VectorIndexer,您可以告诉索引器某个字段可能具有的不同值(基数)的数量,以便使用 setMaxCategories() 方法将其视为分类。

val indexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexed")
.setMaxCategories(10)
Run Code Online (Sandbox Code Playgroud)

来自Scaladocs

用于索引 Vector 数据集中的分类特征列的类。

它有 2 种使用模式:

自动识别分类特征(默认行为)

这有助于将未知向量的数据集处理为具有一些连续特征和一些分类特征的数据集。连续型和分类型之间的选择基于 maxCategories 参数。

将 maxCategories 设置为任何分类特征应具有的最大分类数。

例如:特征 0 具有唯一值 {-1.0, 0.0},特征 1 具有唯一值 {1.0, 3.0, 5.0}。如果 maxCategories = 2,则特征 0 将被声明为分类并使用索引 {0, 1},而特征 1 将被声明为连续。

我发现这是一种提取分类值的便捷(尽管粗粒度)方法,但要注意,在任何情况下,如果您有一个想要连续的数量较低的字段(例如,大学生的年龄与原籍国或美国州) )。


Sau*_*ang 2

Spark 1.4 中即将推出 VectorIndexer,它可能会帮助您进行此类功能转换:http://people.apache.org/~pwendell/spark-1.4.0-rc1-docs/api/scala/index.html#org .apache.spark.ml.feature.VectorIndexer

然而,它看起来只在spark.ml中可用,而不是在mllib中可用

https://issues.apache.org/jira/browse/SPARK-4081