2016-05-21 3 views
1

StandardScalerを使用してデータを拡大したいと思います。私はPythonRDDにデータをロードしました。データがまれであるようです。 StandardScalerを適用するには、まず密な型に変換する必要があります。スパースデータを含むPythonRDDを密なPythonRDDに変換する方法

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 
... 

上記のコードには誤りがあります。 StandardScalerの入力としてすることができ、緻密tpyeにスパースPythonRDD trainFeaturesを変換する方法

  1. :私は2つの質問がありますか?
  2. trainLabeltrainFeatures_scaledを分類器(ランダムフォレストなど)のトレーニングに使用できる新しいLabeledPointにマージするにはどうすればよいですか?

これについての文書または参考文献はまだあります。

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

ジップマージするには::toArrayを使用して密なマップに変換するには

+1

はラリー悪いアイデアすることができます。 – zero323

+0

@ zero323、ありがとうございます!しかし、もしそれをしなければ、SVMによって読み込まれた疎なデータをどのようにスケールするのでしょうか? – mining

+0

@ zero323実際、オリジナルは密であるので、 'MLUtils.loadLibSVMFile'を使ってそれらをロードするためにlibsvm形式に保存します。 'DataFrame'と互換性のあるフォーマットに保存する方が合理的かもしれません。 – mining

答えて

2

密にデータを変換する機能の数に応じて

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

ありがとう!出来た!あなたはこのことについて私がこの知識をどこで知ることができるか教えてください。私は本当にドキュメンテーションを見つけられませんでした。 – mining

+1

ところで、 'Scala'では[SparseVector.toDense](http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.linalg.SparseVector ) 方法。 –

関連する問題