将分类测试数据加载到 Apache Spark 中的稀疏向量中
Posted
技术标签:
【中文标题】将分类测试数据加载到 Apache Spark 中的稀疏向量中【英文标题】:Load classification test data into sparse vector in 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 次遍历数据。
【参考方案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])
【讨论】:
以上是关于将分类测试数据加载到 Apache Spark 中的稀疏向量中的主要内容,如果未能解决你的问题,请参考以下文章
将 CSV 数据加载到 Dataframe 并使用 Apache Spark (Java) 转换为 Array
使用 spark 将 parquet 文件加载到 vertica 数据库中
谁在 Apache Spark 中将分区加载到 RAM 中?