【问题标题】:Feature selection and One-Hot-Encoding in Apache SparkApache Spark 中的特征选择和 One-Hot-Encoding
【发布时间】:2017-07-31 15:00:38
【问题描述】:

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

【问题讨论】:

  • 你能提供一个可重现的例子吗? 一组向量如何对应LabeledPoints并不明确。

标签: scala apache-spark rdd spark-dataframe


【解决方案1】:

@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

但我认为这不是最聪明的方法。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2016-03-02
    • 1970-01-01
    • 2021-04-12
    • 2021-04-15
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多