【问题标题】:how to convert a PythonRDD with sparse data into dense PythonRDD如何将稀疏数据的 PythonRDD 转换为密集的 PythonRDD
【发布时间】:2016-05-21 04:26:13
【问题描述】:

我想使用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,可以用来训练分类器(例如随机森林)?

我仍然可以找到有关此的任何文件或参考资料。

【问题讨论】:

  • 根据特征数量将数据转换为密集可能是一个坏主意。
  • @zero323,感谢您的建议!但是如果我们不这样做,如何缩放 SVM 加载的稀疏数据呢?
  • @zero323,其实我们的原图是密集的,我保存成libsvm格式,用MLUtils.loadLibSVMFile加载。我认为将其保存为与DataFrame 兼容的格式可能更合理。
  • 如果原始数据很密集,那么使用 libSVM 格式可以使输出的大小大约翻倍,这也可能不是最好的主意。但我唯一的一点是,在使数据密集时应该小心。在最坏的情况下,这些可能会变得很大
  • @zero323,是的,我应该将数据保存为其他格式,也许处理起来更方便。考虑到您的宝贵建议,我正在尝试使用原始的map-reduce 来计算每个特征维度的均值和标准差。不要使用 StandardScaler。

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


【解决方案1】:

使用toArray转换为稠密地图:

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

要合并 zip:

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

【讨论】:

  • 谢谢!有效!你能告诉我在哪里可以学到这方面的知识吗?我真的没有找到文档。
  • 顺便在Scala你可以使用SparseVector.toDense方法。
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多