我正在研究一个分类模型,我有一个问题,即为模型创建正确的数据形式。在我的数据集中有3列和。我用给定的水桶将这些列离散化。其余的列都是用string作为值的分类列。我使用StringIndexer来转换这些特性。之后,我通过ChiSqSelector选择最好的列。到目前为止一切顺利。现在我想把分类特征转换成虚拟变量。我不知道怎么做因为我已经有了LabeledPoints形式的数据。是否有一个简单的方法或给定的解决方案,转换值从一组向量到虚拟变量?或者有人建议用另一种方式解决这个问题吗?
@zero323 ChiSqSelector的输入必须是RDD[LabeledPoint]。我的数据有25个特征。我选择了15个最好的功能,但为了简单起见,假设我有以下标签点:
LabeledPoint(1, [1, 2, 3])
LabeledPoint(0, [2, 1, 3])
LabeledPoint(1, [1, 3, 1])
例如,ChiSqSelector只选择最好的(第一个)特征,所以我的标签点是:
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
但我认为这不是最聪明的方法。