我正在研究分类模型,但在为模型创建正确形式的数据时遇到问题。在我的数据集中,有 3 列带有总和。我使用给定的 Bucketizer 对这些列进行了离散化。其余列以字符串作为值进行分类。我使用 StringIndexer 来转换这些功能。然后我通过 ChiSqSelector 选择最好的列。到目前为止,一切都很好。但现在我想转换虚拟变量中的分类特征。我不知道该怎么做,因为我已经有了 LabeledPoints 形式的数据。有没有简单的方法或给定的解决方案将值从一组向量转换为虚拟变量?或者有没有人建议以另一种方式解决这个问题?
问问题
1173 次
1 回答
0
@zero323 ChiSqSelector 的输入必须是 RDD[LabeledPoint]。我的数据有 25 个特征。我选择了 15 个最佳特征,但为简单起见,假设我有以下 LabeledPoints:
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 转换为 Row 并将此 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
但我认为这不是最聪明的方法。
于 2015-09-09T06:31:59.083 回答