Ejecución de un modelo ALS implícito con validación cruzada
Ahora que tenemos varios modelos ALS, cada uno con un conjunto distinto de hiperparámetros, podemos entrenarlos en una parte de entrenamiento del conjunto de datos msd usando validación cruzada, y después ejecutarlos sobre un conjunto de prueba y evaluar su rendimiento con la función ROEM que vimos antes. Lamentablemente, esto lleva demasiado tiempo para este ejercicio, así que se ha hecho por separado. Pero, para que lo tengas de referencia, puedes evaluar tu model_list con el siguiente bucle (en este caso usamos el conjunto 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)
Para acompañarte en los pasos, ya se han generado las predicciones de prueba para 192 modelos y se ha calculado su ROEM. Las encontrarás en la lista ROEMS proporcionada. Como una lista no es algo específico de PySpark y numpy funciona muy bien con listas, usaremos numpy aquí. Sigue las instrucciones de abajo para encontrar el mejor ROEM y el modelo que lo obtuvo.
Este ejercicio forma parte del curso
Creación de motores de recomendación con PySpark
Instrucciones del ejercicio
- Importa
numpy. - Extrae el ROEM más pequeño de la lista
ROEMSusandonumpy.argmin(). El método.argmin()devuelve el índice del valor más bajo de la lista. Llama al resultadoie imprimei. - Usa indexación de listas para obtener el valor de
ROEMSen el índicei.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
# 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: ", ____[____])