【问题标题】:Load classification test data into sparse vector in Apache Spark将分类测试数据加载到 Apache Spark 中的稀疏向量中
【发布时间】:2016-03-07 03:19:09
【问题描述】:

我在 Spark MLlib 中有一个使用训练数据构建的分类模型。现在我想用它来预测未标记的数据。

我有 LIBSVM 格式的特征(没有标签)。这是我的未标记数据的样例

1:1  18:1
4:1  32:1
2:1  8:1  33:1
1:1  6:1  11:1
1:1  2:1  8:1  28:1

我将这些功能保存在 HDFS 上的文本文件中。如何将它们加载到 RDD[Vector] 中,以便将它们传递给 model.predict()?

我使用 Scala 进行编码。

谢谢。

【问题讨论】:

  • 地图,空间分割,分割:创建稀疏向量
  • 如何知道LIBSVM文件中数据的维数?
  • 他需要 2 次遍历数据。

标签: scala apache-spark libsvm apache-spark-mllib


【解决方案1】:

考虑到索引是从一开始并按升序排列的,这是一个解决方案。

让我们创建一些类似于文本文件中的虚拟数据。

val data = sc.parallelize(Seq("1:1  18:1", "4:1  32:1", "2:1  8:1  33:1", "1:1  6:1  11:1", "1:1  2:1  8:1  28:1"))

我们现在可以将数据转换成一对RDD,带有索引和值。

val parsed = data.map(_.trim).map { line =>
  val items = line.split(' ')
  val (indices, values) = items.filter(_.nonEmpty).map { item =>
    val indexAndValue = item.split(':')
    val index = indexAndValue(0).toInt - 1 // Convert 1-based indices to 0-based.
  val value = indexAndValue(1).toDouble
    (index, value)
  }.unzip

  (indices.toArray, values.toArray)
}

获取特征数量

val numFeatures = parsed.map { case (indices, values) => indices.lastOption.getOrElse(0) }.reduce(math.max) + 1

最后创建向量

val vectors = parsed.map { case (indices, values) => Vectors.sparse(numFeatures, indices, values) }

vectors.take(10) foreach println
// (33,[0,17],[1.0,1.0])
// (33,[3,31],[1.0,1.0])
// (33,[1,7,32],[1.0,1.0,1.0])
// (33,[0,5,10],[1.0,1.0,1.0])
// (33,[0,1,7,27],[1.0,1.0,1.0,1.0])

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2015-12-04
    • 1970-01-01
    • 2017-08-30
    • 2023-03-22
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多