【发布时间】: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
...
以上代码有错误。我有两个问题:
- 如何将稀疏的 PythonRDD
trainFeatures转换为密集的 tpye 可以作为StandardScaler的输入? - 如何将
trainLabel和trainFeatures_scaled合并成一个新的LabeledPoint,可以用来训练分类器(例如随机森林)?
我仍然可以找到有关此的任何文件或参考资料。
【问题讨论】:
-
根据特征数量将数据转换为密集可能是一个坏主意。
-
@zero323,感谢您的建议!但是如果我们不这样做,如何缩放 SVM 加载的稀疏数据呢?
-
@zero323,其实我们的原图是密集的,我保存成libsvm格式,用
MLUtils.loadLibSVMFile加载。我认为将其保存为与DataFrame兼容的格式可能更合理。 -
如果原始数据很密集,那么使用 libSVM 格式可以使输出的大小大约翻倍,这也可能不是最好的主意。但我唯一的一点是,在使数据密集时应该小心。在最坏的情况下,这些可能会变得很大
-
@zero323,是的,我应该将数据保存为其他格式,也许处理起来更方便。考虑到您的宝贵建议,我正在尝试使用原始的
map-reduce来计算每个特征维度的均值和标准差。不要使用 StandardScaler。
标签: python apache-spark pyspark apache-spark-mllib