python - 如何将稀疏数据的PythonRDD转换为密集的PythonRDD

标签 python apache-spark pyspark apache-spark-mllib

我想使用StandardScaler来缩放数据。我已将数据加载到 PythonRDD 中。看起来数据很稀疏。要应用StandardScaler,我们应该首先将其转换为密集类型。

trainData = MLUtils.loadLibSVMFile(sc, trainDataPath)
valData = MLUtils.loadLibSVMFile(sc, valDataPath) 
trainLabel = trainData.map(lambda x: x.label)
trainFeatures = trainData.map(lambda x: x.features)
valLabel = valData.map(lambda x: x.label)
valFeatures = valData.map(lambda x: x.features)
scaler = StandardScaler(withMean=True, withStd=True).fit(trainFeatures)

# apply the scaler into the data. Here, trainFeatures is a sparse PythonRDD, we first convert it into dense tpye
trainFeatures_scaled = scaler.transform(trainFeatures)
valFeatures_scaled = scaler.transform(valFeatures)    

# merge `trainLabel` and `traiFeatures_scaled` into a new PythonRDD
trainData1 = ...
valData1 = ...

# using the scaled data, i.e., trainData1 and valData1 to train a model
...

上面的代码有错误。我有两个问题:

  1. 如何将稀疏的 PythonRDD trainFeatures 转换为密集的 tpye,作为 StandardScaler 的输入?
  2. 如何将 trainLabeltrainFeatures_scaled 合并到可用于训练分类器(例如随机森林)的新 LabeledPoint 中?

我仍然找到有关此的任何文档或引用资料。

最佳答案

使用toArray转换为密集 map :

dense = valFeatures.map(lambda v: DenseVector(v.toArray()))

合并 zip:

valLabel.zip(dense).map(lambda (l, f): LabeledPoint(l, f))

关于python - 如何将稀疏数据的PythonRDD转换为密集的PythonRDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358865/

相关文章:

apache-spark - 使用训练、测试和验证集进行 Spark 交叉验证

python - matplotlib.pyplot.streamplot 中的轴错误

python - 如何命令自动化测试停留在监视器的一个地方

apache-spark - Pyspark 按顺序将多个 csv 文件读取到数据框中

scala - 如何使用 Spark 独立集群在工作节点上管理多个执行程序?

google-cloud-platform - 如何在 Dataproc 上的提交作业函数中包含 jar URI

apache-spark - 使用自定义内核数和内存大小运行 Spark 应用程序

python - 如何使用 Python 3 将信息从 Tkinter 中的表单发送到 ScrolledText?

python - 以 3 组为一组设置每个条的颜色

Azure Databricks 情绪分析不起作用