Apache Spark中的功能选择和One-Hot-Encoding

时间:2015-09-08 18:29:40

标签: scala apache-spark rdd spark-dataframe

我正在研究分类模型,我有一个问题是为模型创建正确的数据形式。 在我的数据集中有3列和总和。我用给定的Bucketizer对这些列进行了离散化处理。其余列是以字符串作为值的分类。我使用StringIndexer来转换这些功能。然后我通过ChiSqSelector选择最佳列。到现在为止还挺好。 但现在我想转换虚拟变量中的分类特征。我不知道该怎么做,因为我已经有了LabeledPoints形式的数据。是否有一种简单的方法或给定的解决方案将值从一组向量转换为虚拟变量?或者有人建议以另一种方式解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

@ zero323 ChiSqSelector的输入必须是RDD [LabeledPoint]。我的数据有25个功能。我选择了15个最佳功能,但为了简单起见,我想说我有以下标签:

LabeledPoint(1, [1, 2, 3])
LabeledPoint(0, [2, 1, 3])
LabeledPoint(1, [1, 3, 1])

例如,ChiSqSelector仅选择最佳(第一个)功能,因此我的LabeledPoints是:

LabeledPoint(1, [1])
LabeledPoint(0, [2])
LabeledPoint(1, [1])

现在我的LabeledPoints是如何将特征向量中的要素编码为虚拟变量:

LabeledPoint(1, [1, 0])
LabeledPoint(0, [0, 1])
LabeledPoint(1, [1, 0])

希望有所帮助。或者你需要一些代码吗?

编辑: 我现在的想法是这样的: 将每个LabeledPoint的标签和功能转换为行,并将此RDD转换为DataFrame以使用OneHotEncoder:

val data = chiData.map{ r=>
   val label = r.label
   val feature1 = r.features.toArray(0)
   val feature2 = r.features.toArray(1)
   val feature3 = r.features.toArray(2)
   ....
   Row(label, feature1, feature2, feature3, ...)
}
//Convert RDD to DataFrame
//Use OneHotEncoder
//Create LabeledPoints again for use in Algorithms

但我认为这不是最明智的方式。