web-dev-qa-db-fra.com

convertir des données au format libsvm

J'ai un dataframe résultant d'une requête SQL

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

J'ai besoin de convertir ce cadre de données au format libsvm afin qu'il puisse être fourni en tant qu'entrée pour 

pyspark.ml.classification.LogisticRegression

J'ai essayé de faire ce qui suit. Cependant, cela a entraîné l'erreur suivante car j'utilise spark 1.5.2

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

Je voulais plutôt utiliser MLUtils.loadLibSVMFile. Je suis derrière un pare-feu et je ne peux pas l'installer directement. J'ai donc téléchargé le fichier, je l'ai scp-ed puis installé manuellement. Tout semblait bien fonctionner mais j'obtiens toujours l'erreur suivante

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

Question 1: Est-ce que mon approche ci-dessus est de convertir la structure de données au format libsvm dans la bonne direction .. Question 2: Si vous avez répondu «oui» à la question 1, comment faire fonctionner MLUtils. Si "non", quel est le meilleur moyen de convertir dataframe au format libsvm 

7
sah.stc

J'agirais comme ça (c'est juste un exemple avec un cadre de données arbitraire, je ne sais pas comment votre df1 est fait, l'accent est mis sur la transformation de données)

Ceci est ma façon de convertir dataframe au format 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/")

Ce que vous verrez sur les fichiers "/ votre/Chemin/nom/dossier/part-0000 *" est:

1.0 1: 3.0 2: 6.0

4.0 1: 5.0 2: 20.0

7.0 1: 8.0 2: 8.0

Voir ici pour les documents LabeledPoint

6
titiro89

Je devais le faire pour que cela fonctionne

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