Rularea unui model ALS implicit cu validare încrucișată
Acum că avem mai multe modele ALS, fiecare cu un set diferit de valori ale hiperparametrilor, le putem antrena pe o porțiune de antrenament a setului de date msd folosind validarea încrucișată, apoi le putem rula pe un set de testare și evalua cât de bine performează fiecare, folosind funcția ROEM discutată anterior. Din păcate, acest proces necesită prea mult timp pentru acest exercițiu, așa că a fost realizat separat. Ca referință, poți evalua model_list folosind bucla de mai jos (în acest caz folosim setul de date msd):
# Split the data into training and test sets
(training, test) = msd.randomSplit([0.8, 0.2])
#Building 5 folds within the training set.
train1, train2, train3, train4, train5 = training.randomSplit([0.2, 0.2, 0.2, 0.2, 0.2], seed = 1)
fold1 = train2.union(train3).union(train4).union(train5)
fold2 = train3.union(train4).union(train5).union(train1)
fold3 = train4.union(train5).union(train1).union(train2)
fold4 = train5.union(train1).union(train2).union(train3)
fold5 = train1.union(train2).union(train3).union(train4)
foldlist = [(fold1, train1), (fold2, train2), (fold3, train3), (fold4, train4), (fold5, train5)]
# Empty list to fill with ROEMs from each model
ROEMS = []
# Loops through all models and all folds
for model in model_list:
for ft_pair in foldlist:
# Fits model to fold within training data
fitted_model = model.fit(ft_pair[0])
# Generates predictions using fitted_model on respective CV test data
predictions = fitted_model.transform(ft_pair[1])
# Generates and prints a ROEM metric CV test data
r = ROEM(predictions)
print ("ROEM: ", r)
# Fits model to all of training data and generates preds for test data
v_fitted_model = model.fit(training)
v_predictions = v_fitted_model.transform(test)
v_ROEM = ROEM(v_predictions)
# Adds validation ROEM to ROEM list
ROEMS.append(v_ROEM)
print ("Validation ROEM: ", v_ROEM)
Pentru a-ți parcurge pașii, predicțiile de testare pentru 192 de modele au fost deja generate, iar valoarea ROEM a fost calculată pentru fiecare. Acestea se găsesc în lista ROEMS furnizată. Deoarece o listă nu este specifică PySpark și numpy funcționează foarte bine cu liste, vom folosi numpy aici. Urmează instrucțiunile de mai jos pentru a găsi cel mai bun ROEM și modelul care l-a produs.
Acest exercițiu face parte din cursul
Construiește motoare de recomandare cu PySpark
Instrucțiuni pentru exercițiu
- Importă
numpy. - Extrage cel mai mic ROEM din lista
ROEMSfurnizată folosindnumpy.argmin(). Metoda.argmin()returnează indexul celei mai mici valori din lista dată. Numește rezultatuliși afișeazăi. - Folosește feliere de listă pentru a găsi valoarea din lista
ROEMSla indexuli.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# Import numpy
import numpy
# Find the index of the smallest ROEM
i = numpy.____(____)
print("Index of smallest ROEM:", ____)
# Find ith element of ROEMS
print("Smallest ROEM: ", ____[____])