c'est ma première fois avec PySpark, (Spark 2), et j'essaie de créer un cadre de données jouet pour un modèle Logit. J'ai exécuté avec succès le tutoriel et j'aimerais y passer mes propres données.
J'ai essayé ça:
%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 ne peux pas me débarrasser de:
TypeError: Cannot convert type <class 'pyspark.ml.linalg.DenseVector'> into Vector
J'utilise la bibliothèque ML pour le vecteur et l'entrée est un double tableau, alors quel est le problème, s'il vous plaît? Ça devrait aller selon documentation .
Merci beaucoup.
Vous mélangez des fonctionnalités de ML et MLlib, qui ne sont pas nécessairement compatibles. Vous n'avez pas besoin d'un LabeledPoint
lorsque vous utilisez 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 entrées en mode maintenance. L'API primaire d'apprentissage automatique pour Spark est maintenant l'API basée sur DataFrame dans le package spark.ml. [réf.]
De Numpy à Pandas à 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| +-------------------+-------------------+------------------+-------------------+
Le problème est facile à résoudre. Vous utilisez simultanément les API ml
et mllib
. S'en tenir à un seul. Sinon, vous obtenez cette erreur.
Voici la solution pour 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 l'API ml
, vous n'avez plus vraiment besoin de LabeledPoint
. Voici un exemple . Je suggère d'utiliser l'API ml
car l'API mllib
va bientôt devenir obsolète.