Esecuzione di un modello ALS implicito con convalida incrociata
Ora che abbiamo diversi modelli ALS, ognuno con un diverso set di iperparametri, possiamo addestrarli su una parte di training dell'insieme di dati msd usando la convalida incrociata, quindi eseguirli su un insieme di test e valutare le prestazioni di ciascuno usando la funzione ROEM di cui abbiamo parlato prima. Purtroppo questo richiede troppo tempo per questo esercizio, quindi è stato fatto separatamente. Per riferimento, però, puoi valutare il tuo model_list usando il seguente ciclo (in questo caso stiamo usando l'insieme di dati 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)
Per accompagnarti passo passo, le predizioni di test per 192 modelli sono già state generate e il loro ROEM è stato calcolato. Si trovano nella lista ROEMS fornita. Poiché una lista non è specifica di PySpark e perché numpy funziona molto bene con le liste, qui useremo numpy. Segui le istruzioni qui sotto per trovare il ROEM migliore e il modello che lo ha prodotto.
Questo esercizio fa parte del corso
Costruire motori di raccomandazione con PySpark
Istruzioni dell'esercizio
- Importa
numpy. - Estrai il ROEM più piccolo dalla lista
ROEMSfornita usandonumpy.argmin(). Il metodo.argmin()restituisce l'indice del valore più basso nella lista data. Chiama il risultatoie stampai. - Usa lo slicing delle liste per trovare il valore nella lista
ROEMSall'indicei.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
# 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: ", ____[____])