Я пытаюсь построить систему рекомендаций с использованием Spark, ML ALS, где данными являются следующимиКак использовать реализацию искровой ML АЛС, которая поддерживает общие типы идентификаторов (Int и Long)
"User-ID";"ISBN "; "Book-Rating"
276725;034545104;0
276726;0155061224;5
276727;0446520802;0
276729;052165615;3
276729;0521795028;6
Я использую Spark 2.1.0 и mongoldb для загрузки данных. Вот мой фрагмент кода, который определяет кадр данных и его шема после кастинга.
/*
* Chargement de données de rating
*/
val dfrating = spark.loadFromMongoDB(readConfig)
val bookRatings = dfrating.selectExpr("cast(User_ID as Long) User_ID " ,"cast(ISBN as Long) ISBN ", "Book_Rating")
bookRatings.printSchema()
val als = new ALS().setMaxIter(10).setRegParam(0.01).setUserCol("User_ID").setItemCol("ISBN").setRatingCol("Book_Rating")
val model = als.fit(training)
———- After compiling, I have got ——
root
|-- User_ID: long (nullable = true)
|-- ISBN: long (nullable = true)
|-- Book_Rating: integer (nullable = true)
+-------+----------+-----------+
|User_ID| ISBN|Book_Rating|
+-------+----------+-----------+
| 215| 61030147| 6|
| 5750|1853260045| 0|
| 11676| 743244249| 0|
| 11676|1551665700| 0|
Вызванные: java.lang.IllegalArgumentException: АЛС ** поддерживает только значение в диапазоне Integer для столбца сек USER_ID и ISBN. **** Значение ** 8.477024456E9 ** было вне диапазона Integer. ****** at org.apache.spark.ml.recommendation.ALSModelParams $$ anonfun $ 1.apply $ mcID $ sp (ALS.scala : 87)
—————————————————————
Есть ли еще какое-то решение для запуска? У меня есть такие предложения (How to use mllib.recommendation if the user ids are string instead of contiguous integers?How to use long user ID in PySpark ALS, а также Non-integer ids in Spark MLlib ALS) по той же проблеме, но я не знаю, с чего начать. Любая помощь ! Заранее спасибо.
@GPI Спасибо за ваше предложение. Вот что я делаю.
val isbn_als = new StringIndexer()
.setHandleInvalid("skip")
.setInputCol("ISBN")
.setOutputCol("ISBN_als")
.fit(uRatings)
val isbn_als_reverse = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
val als = new ALS().setMaxIter(10).setRegParam(0.01).setUserCol("User_ID").setItemCol("ISBN_als").setRatingCol("Book_Rating")
/*
* On définit l'ordre des opérations à effectuer
*/
println("On passe au Pipeline")
val alsPipeline = new Pipeline().setStages(Array(isbn_als, als, isbn_als_reverse))
/*
* On construit le modèle de recommandation à partir des données de Training
*/
println("On passe à la construction du modèle")
val alsModel = alsPipeline.fit(training)
/*
* On exécute le modèle sur les données de Test, puis on affiche un échantillon de prédictions
*/
println("On exécute le modèle sur les données de Test")
val alsPredictions = alsModel.transform(test).na.drop()
println("Affichage des prédictions")
alsPredictions.select($"User_ID",$"ISBN", $"Book_Rating", $"prediction").show(20)
Но у меня есть это исключение, когда я использую IndexToString() на конвейере.
On passe au Pipeline
On passe à la construction du modèle
On exécute le modèle sur les données de Test
Exception in thread "main" java.lang.ClassCastException: org.apache.spark.ml.attribute.UnresolvedAttribute$ cannot be cast to org.apache.spark.ml.*attribute.NominalAttribute*
at org.apache.spark.ml.feature.IndexToString.transform(StringIndexer.scala:313)
at org.apache.spark.ml.PipelineModel$$anonfun$transform$1.apply(Pipeline.scala:305)
at org.apache.spark.ml.PipelineModel$$anonfun$transform$1.apply(Pipeline.scala:305)
at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:57)
at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:66)
---------------------------------------
Когда я не использую IndexToString(), у меня есть отрицательное предсказание.
+-------+---------+-----------+-------------+
|User_ID| ISBN|Book_Rating| prediction|
+-------+---------+-----------+-------------+
| 140340|786881852| 10| 6.9798374|
| 127327|786881852| 0|-1.2718141E-4|
| 103336|786881852| 0| 1.2374072|
| 138578|786881852| 9| 8.200257|
| 172742|786881852| 0| -1.3278971|
| 31909|786881852| 6| 5.997123|
| 69554|786881852| 5| 2.819587|
| 173650|786881852| 0| 0.42850634|
---------------------------------
Я полагаю, что отрицательный прогноз из-за IndexToString(), который не используется. Если да, то как использовать IndexToString() в конвейере? Спасибо в продвинутом состоянии
GPI, он исправляет мой допрос. Спасибо за ваше время. –
@ MAA-BIK вы можете пометить ответ как принятый, если он работает для вас, и/или опросить его. – GPI
GPI извините! Это работает для меня –