18 votes

Création d'un dataframe Spark à partir d'une matrice numpy

C'est la première fois que j'utilise PySpark, (Spark 2), et j'essaie de créer un dataframe pour un modèle Logit. J'ai exécuté avec succès la commande tutoriel et j'aimerais y intégrer mes propres données.

J'ai essayé :

%pyspark
import numpy as np
from pyspark.ml.linalg import Vectors, VectorUDT
from pyspark.mllib.regression import LabeledPoint

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
df = map(lambda x: LabeledPoint(x[0], Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(df,["label", "features"])

mais je n'arrive pas à me débarrasser de :

TypeError: Cannot convert type <class 'pyspark.ml.linalg.DenseVector'> into Vector

J'utilise la bibliothèque ML pour les vecteurs et l'entrée est un tableau double, alors quel est le problème, s'il vous plaît ? Cela devrait être correct d'après le la documentation .

Merci beaucoup.

12voto

Jeff Hernandez Points 452

De Numpy à Pandas en passant par Spark :

spark.createDataFrame(pd.DataFrame(np.random.rand(4,4),columns=list('abcd'))).show()

Sortie : +-------------------+-------------------+------------------+-------------------+ | a| b| c| d| +-------------------+-------------------+------------------+-------------------+ | 0.8026427193838694|0.16867056812634307|0.2284873209015007|0.17141853164400833| | 0.2559088794287595| 0.3896957084615589|0.3806810025185623| 0.9362280141470332| |0.41313827425060257| 0.8087580640179158|0.5547653674054028| 0.5386190454838264| | 0.2948395900484454| 0.4085807623354264|0.6814694724946697|0.32031773805256325| +-------------------+-------------------+------------------+-------------------+

8voto

desertnaut Points 15220

Vous mélangez des fonctionnalités de ML et de MLlib, qui ne sont pas nécessairement compatibles. Vous n'avez pas besoin d'un LabeledPoint lors de l'utilisation de spark-ml :

sc.version
# u'2.1.1'

import numpy as np
from pyspark.ml.linalg import Vectors

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
dff = map(lambda x: (int(x[0]), Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(dff,schema=["label", "features"])

mydf.show(5)
# +-----+-------------+ 
# |label|     features| 
# +-----+-------------+ 
# |    1|[0.0,0.0,0.0]| 
# |    0|[0.0,1.0,1.0]| 
# |    0|[0.0,1.0,0.0]| 
# |    1|[0.0,0.0,1.0]| 
# |    0|[0.0,1.0,0.0]|
# +-----+-------------+

PS : Depuis Spark 2.0, les API basées sur RDD dans le package spark.mllib sont passées en mode maintenance. La principale API d'apprentissage automatique pour Spark est désormais l'API basée sur le DataFrame dans le package spark.ml. [réf.]

2voto

Dat Tran Points 1710

Le problème est facile à résoudre. Vous utilisez le ml y el mllib API en même temps. Il faut s'en tenir à une seule. Sinon, vous obtiendrez cette erreur.

C'est la solution pour le mllib API :

import numpy as np
from pyspark.mllib.linalg import Vectors, VectorUDT
from pyspark.mllib.regression import LabeledPoint

df = np.concatenate([np.random.randint(0,2, size=(1000)), np.random.randn(1000), 3*np.random.randn(1000)+2, 6*np.random.randn(1000)-2]).reshape(1000,-1)
df = map(lambda x: LabeledPoint(x[0], Vectors.dense(x[1:])), df)

mydf = spark.createDataFrame(df,["label", "features"])

Pour les ml API, vous n'avez pas vraiment besoin de LabeledPoint plus. Voici un exemple . Je suggère d'utiliser la fonction ml depuis l'introduction de l'API mllib sera bientôt obsolète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X