Comment préparer des données dans un format LibSVM à partir de DataFrame?
Je veux faire libsvm format, j'ai donc fait dataframe pour le format souhaité, mais je ne sais pas comment les convertir pour libsvm format. Le format est tel que montré dans la figure. J'espère que le souhaité libsvm type est utilisateur item:notation . Si vous savez quoi faire dans la situation actuelle :
val ratings = sc.textFile(new File("/user/ubuntu/kang/0829/rawRatings.csv").toString).map { line =>
val fields = line.split(",")
(fields(0).toInt,fields(1).toInt,fields(2).toDouble)
}
val user = ratings.map{ case (user,product,rate) => (user,(product.toInt,rate.toDouble))}
val usergroup = user.groupByKey
val data =usergroup.map{ case(x,iter) => (x,iter.map(_._1).toArray,iter.map(_._2).toArray)}
val data_DF = data.toDF("user","item","rating")
source d'informationauteur Data diaboli
Vous devez vous connecter pour publier un commentaire.
Le problème que vous rencontrez peut être divisé en :
LabeledPoint
données X.1. La conversion de vos cotes dans les
LabeledPoint
données XConsidérons les premières suivantes cotes :
Vous permet de gérer ces premières notes comme un coordonner la liste de la matrice (COO).
Étincelle met en œuvre une matrice distribuée soutenu par une EDR de ses entrées :
CoordinateMatrix
où chaque entrée est un n-uplet (i: Longue, j: Longue, valeur: Double).Remarque : Un CoordinateMatrix doit être utilisé uniquement lorsque les deux dimensions de la matrice sont énormes, et la matrice est très clairsemée. (ce qui est généralement le cas de l'utilisateur/item ratings.)
Maintenant, nous allons convertir que
RDD[MatrixEntry]
à unCoordinateMatrix
et d'en extraire les lignes indexées :2. Enregistrement LabeledPoint données dans libsvm format
Depuis Spark 2.0Vous pouvez le faire en utilisant les
DataFrameWriter
. Nous allons créer un petit exemple avec un mannequin LabeledPoint de données (vous pouvez également utiliser leDataFrame
nous avons créé précédemment) :Nous ne pouvons malheureusement pas utiliser le
DataFrameWriter
directement parce que tandis que la plupart des composants de pipeline en charge la compatibilité descendante pour le chargement de certains DataFrames et les pipelines Étincelle dans les versions antérieures à la 2.0, qui contiennent vecteur ou d'une matrice de colonnes, peuvent être migrés vers la nouvelle étincelle.ml matrice et vecteur de types.Utilitaires pour la conversion DataFrame les colonnes de
mllib.linalg
àml.linalg
types (et vice versa) peut être trouvé dansorg.apache.spark.mllib.util.MLUtils.
Dans notre cas, nous avons besoin de faire ce qui suit (à la fois pour les données factices et lesDataFrame
destep 1.
)Maintenant, nous allons enregistrer le DataFrame :
Et nous pouvons vérifier le contenu des fichiers :
MODIFIER:
Dans la version actuelle de l'étincelle (2.1.0) il n'est pas nécessaire d'utiliser
mllib
paquet. Vous pouvez simplement sauvegarderLabeledPoint
données dans libsvm format comme ci-dessous: