// -*- coding: utf-8 -*-
// ---
// jupyter:
//   jupytext:
//     text_representation:
//       extension: .scala
//       format_name: light
//       format_version: '1.5'
//       jupytext_version: 1.14.4
//   kernelspec:
//     display_name: Apache Toree - Scala
//     language: scala
//     name: apache_toree_scala
// ---

// # Sparkathon 30.01.2018

// ## Recommender system

// Najpierw przetestujemy środowisko

spark

// ### Wczytywanie danych

// Wczytamy plik. opcja header oznacza że pierwsza linijka zawiera nazwy kolumn
// inferSchema oznacza że Spark automatycznie spróbuje wywnioskować jaki kształ mają dane wejściowe i na tej podstawie zbuduje DataFrame

// #### Ratings (Movie lens dataset)

val ratings = spark.read.option("header", true).
                        option("inferSchema", true).
                        csv("/home/jovyan/resources/small/ratings.csv")

// #### Movies (Movielens dataset) 
// tu się znajdują informację o filmach (nazwa, rok, gatunek i oczywiście id)

val movies = spark.read.option("header", true).
                        option("inferSchema", true).
                        csv("/home/jovyan/resources/small/movies.csv")

ratings.show

movies.show

// #### Dzielimy dane na zbiór treningowy i zbiór testowy

val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

training.show

test.show

// #### Importujemy implementację Sparkową algorytmu Alternating Least Squares (ALS)

// +
import org.apache.spark.ml.recommendation.{ALS, ALSModel}
 
val als = new ALS().setMaxIter(5).
                    setRegParam(0.01).
                    setColdStartStrategy("drop").
                    setUserCol("userId").
                    setItemCol("movieId").
                    setRatingCol("rating")
// -

// #### Tworzymy model z danych wejściowych (dataframu ratings) i algorytmu ALS

val model: ALSModel = als.fit(training)

model.recommendForAllUsers(10).show()

// ### Ocena wyniku

// Dla oceny wyniku musimy najpierw przekształcić zbiór testowy za pomocą naszego modełu.

val predictions = model.transform(test)

// I stworzyć metodę oceny wyniku. Wybrałem RMSE (Root mean square error) jako miara błędu.

// +
import org.apache.spark.ml.evaluation.RegressionEvaluator

val evaluator = new RegressionEvaluator().setMetricName("rmse").
                                            setLabelCol("rating").
                                            setPredictionCol("prediction")
val rmse = evaluator.evaluate(predictions)
println(s"Root-mean-square error = $rmse")
// -





StarcoderdataJupyterScriptsDedupFiltered