web-dev-qa-db-ja.com

データフレームをlibsvm形式に変換します

SQLクエリの結果のデータフレームがあります

df1 = sqlContext.sql("select * from table_test")

このデータフレームをlibsvm形式に変換して、の入力として提供できるようにする必要があります。

pyspark.ml.classification.LogisticRegression

私は次のことを試みました。ただし、spark 1.5.2を使用しているため、次のエラーが発生しました。

df1.write.format("libsvm").save("data/foo")
Failed to load class for data source: libsvm

代わりにMLUtils.loadLibSVMFileを使用したかったのです。ファイアウォールの背後にいて、直接pipインストールできません。そこで、ファイルをダウンロードしてscp-edし、手動でインストールしました。すべて正常に動作しているように見えましたが、それでも次のエラーが発生します

import org.Apache.spark.mllib.util.MLUtils
No module named org.Apache.spark.mllib.util.MLUtils

質問1:データフレームを正しい方向でlibsvm形式に変換するための上記のアプローチはありますか?質問2:質問1に「はい」の場合、MLUtilsを機能させる方法。 「いいえ」の場合、データフレームをlibsvm形式に変換する最良の方法は何ですか

8
sah.stc

私はそのように行動します(これは任意のデータフレームを使用した単なる例です。df1がどのように行われるかはわかりません。焦点はデータ変換にあります):

これは、データフレームをlibsvm形式に変換する私の方法です。

# ... your previous imports

from pyspark.mllib.util import MLUtils
from pyspark.mllib.regression import LabeledPoint

# A DATAFRAME
>>> df.show()
+---+---+---+
| _1| _2| _3|
+---+---+---+
|  1|  3|  6|  
|  4|  5| 20|
|  7|  8|  8|
+---+---+---+

# FROM DATAFRAME TO RDD
>>> c = df.rdd # this command will convert your dataframe in a RDD
>>> print (c.take(3))
[Row(_1=1, _2=3, _3=6), Row(_1=4, _2=5, _3=20), Row(_1=7, _2=8, _3=8)]

# FROM RDD OF Tuple TO A RDD OF LABELEDPOINT
>>> d = c.map(lambda line: LabeledPoint(line[0],[line[1:]])) # arbitrary mapping, it's just an example
>>> print (d.take(3))
[LabeledPoint(1.0, [3.0,6.0]), LabeledPoint(4.0, [5.0,20.0]), LabeledPoint(7.0, [8.0,8.0])]

# SAVE AS LIBSVM
>>> MLUtils.saveAsLibSVMFile(d, "/your/Path/nameFolder/")

「/ your/Path/nameFolder/part-0000 *」ファイルに表示されるのは次のとおりです。

1.0 1:3.0 2:6.0

4.0 1:5.0 2:20.0

7.0 1:8.0 2:8.0

LabeledPointのドキュメントについては、 ここ を参照してください。

7
titiro89

私はそれが機能するためにこれをしなければなりませんでした

D.map(lambda line: LabeledPoint(line[0],[line[1],line[2]]))
1
pemfir