Denis Parra
Profesor Asistente, DCC, PUC CHile
Ranking no personalizado: Ordenar items considerando el porcentage de valoraciones positivas y la cantidad total de valoraciones.
Filtrado Colaborativo: Basado en Usuario y en Items. Parámetros principales (K, métrica de distancia), ajustes por baja cantidad de valoraciones.
Slope One: Eficiencia y Escalabilidad por sobre la precisión
Métricas de Evaluación
Próxima Semana: Content-based filtering y tag-based recommenders
\[MAE = \frac{\sum_{i=1}^{n}|\hat{r}_{ui}-r_{ui}|}{n}\]
\[MSE = \frac{\sum_{i=1}^{n}{(\hat{r}_{ui}-r_{ui})^2}}{n}\]
\[RMSE = \sqrt{\frac{\sum_{i=1}^{n}{(\hat{r}_{ui}-r_{ui})^2}}{n}}\]
Si consideramos los elementos recomendados como un conjunto \(S\) y los elementos relevantes como el conjunto \(R\), tenemos:
Luego, Precision es:
\[Precision = \frac{|Recomendados \cap Relevantes|}{|Recomendados|}, \textit{y}\]
\[Recall = \frac{|Recomendados \cap Relevantes|}{|Relevantes|}\]
Si bien la lista de recomendaciones está rankeada, para estas métricas la lista se entiende más bien como un conjunto.
\[Precision = ??\]
\[Recall = ??\]
\[Precision = ??\]
\[Recall = ??\]
\[Precision = \frac{5}{10} = 0,5\]
\[Recall = \frac{5}{20} = 0,25\]
\[Precision = \frac{3}{5} = 0,6\]
\[Recall = \frac{3}{20} = 0,15\]
Al aumentar el Recall (la proporción de elementos relevantes) disminuimos la precision, por lo cual hay un compromiso entre ambas métricas.
Por ello, generalmente reportamos la media harmónica entre ambas métricas: \[F_{\beta=1} = \frac{2*Precision*Recall}{P+R}\]
Consideramos la posición en la lista del primer elemento relevante.
\[MRR = \frac{1}{r}, \textit{donde r: ranking del 1er elemento relevante}\]
\[MRR_1 = ??\]
\[MRR_2 = ??\]
Problema: Usualmente tenemos más de un elemento relevante!!
Consideramos la posición en la lista del primer elemento relevante.
\[MRR = \frac{1}{r}, \textit{donde r: ranking del 1er elemento relevante}\]
\[MRR_1 = \frac{1}{2} = 0,5\]
\[MRR_2 = \frac{1}{2} = 0,5\]
Problema: Usualmente tenemos más de un elemento relevante!!
Corresponde a la \(precision\) en puntos específicos de la lista de items recomendados. En otras palabras, dado un ranking específica en la lista de recomendaciones, qué proporción de elementos relevantes hay hasta ese punto
\[Precision@n = \frac{\sum_{i = 1}^n{Rel(i)}}{n}, \textit{donde } Rel(i) = 1 \textit{si elemento es relevante}\]
\[Precision@5 = ??\]
\[Precision@5 = ??\]
Corresponde a la \(precision\) en puntos específicos de la lista de items recomendados. En otras palabras, dado un ranking específica en la lista de recomendaciones, qué proporción de elementos relevantes hay hasta ese punto
\[Precision@n = \frac{\sum_{i = 1}^n{Rel(i)}}{n}, \textit{donde } Rel(i) = 1 \textit{si elemento es relevante}\]
\[Precision@5 = \frac{2}{5} = 0,4\]
\[Precision@5 = \frac{3}{5} = 0,6\]
Pro: permite evaluar topN; Problema: aún no permite una evalución orgánica del los items con \(ranking < n\).
\[AP = \frac{\sum_{k \in K}{P@k \times rel(k)}}{|relevantes|}\]
donde \(P@k\) es la precision en el recall point \(k\), \(rel(k)\) es una función que indica 1 si el ítem en el ranking j es relevante (0 si no lo es), y \(K\) son posiciones de ranking con elementos relevantes.
\[MAP = \frac{\sum_{u=1}^{n}{AP(u)}}{m}, \textit{donde m es el numero de usuarios.}\]
Como no siempre sabemos de antemano el número de relevantes o puede que hagamos una lista que no alcanza a encontrar todos los elementos relevantes, podemos usar una formulación alternativa** para Average Precision (AP@n)
\[AP@n = \frac{\sum_{k \in K}{P@k \times rel(k)}}{min(m,n)}\]
donde \(n\) es el máximo número de recomendaciones que estoy entregando en la lista, y \(m\) es el número de elementos relevantes.
Parametros | Formula |
---|---|
|
![]() |
\[DCG = \sum_i^p\frac{2^{rel_{i}}-1}{log_2(1+i)}\]
library(rrecsys)
data("mlLatest100k")
ML <- defineData(mlLatest100k, minimum = .5, maximum = 5, halfStar = TRUE)
ML
## Dataset containing 718 users and 8927 items.
# rowRatings(ML) : number of ratings per row
# colRatings(ML) : number of ratings per columns
numRatings(ML)
## [1] 100234
sparsity(ML)
## [1] 0.9843619
# Ratings por usuario
hist( log(rowRatings(ML)) )
plot(sort(rowRatings(ML), decreasing = T))
subML <- ML[rowRatings(ML)>=40, colRatings(ML)>=30]
sparsity(subML)
## [1] 0.8683475
# RecSys no personalizado ----
globAv <- rrecsys(subML, alg = "globalaverage")
# predict and recommend for all
p_globAv <- predict(globAv) # output: matriz de predicciones
r_globAv <- recommend(globAv, topN = 2) # output: lista con recomendaciones
e <- evalModel(subML, folds = 5)
evalPred(e, 'globalaverage')
##
## Fold: 1 / 5 elapsed. Time: 0.03804708
##
##
## Fold: 2 / 5 elapsed. Time: 0.03415608
##
##
## Fold: 3 / 5 elapsed. Time: 0.03495908
##
##
## Fold: 4 / 5 elapsed. Time: 0.04891706
##
##
## Fold: 5 / 5 elapsed. Time: 0.04247308
##
## The model was trained on the dataset using globalAverage algorithm.
## MAE RMSE globalMAE globalRMSE
## 1-fold 0.8372151 0.9930604 0.8069286 1.0100655
## 2-fold 0.8431685 0.9997370 0.8093622 1.0120210
## 3-fold 0.8228661 0.9798062 0.7970749 1.0010374
## 4-fold 0.8259744 0.9794638 0.7957841 0.9992901
## 5-fold 0.8242592 0.9792238 0.7988995 1.0038996
## Average 0.8306966 0.9862583 0.8016099 1.0052627
evalRec(e, 'globalaverage', goodRating = 4, topN = 5)
## Evaluating top- 5 recommendation with globalAverage .
##
## Fold: 1 / 5 elapsed. Time: 0.229358
##
##
## Fold: 2 / 5 elapsed. Time: 0.229378
##
##
## Fold: 3 / 5 elapsed. Time: 0.2041221
##
##
## Fold: 4 / 5 elapsed. Time: 0.188154
##
##
## Fold: 5 / 5 elapsed. Time: 0.1923082
##
## The model was trained on the dataset using globalAverage algorithm.
## Item coverage: 2.115159 %.
##
## User coverage: 100 %.
## TP FP TN FN precision recall
## 1-fold 0.1391129 4.860887 833.2641 12.73589 0.02782258 0.02432124
## 2-fold 0.1653226 4.834677 833.1492 12.85081 0.03306452 0.02173401
## 3-fold 0.1391129 4.860887 833.1169 12.88306 0.02782258 0.03048048
## 4-fold 0.1653226 4.834677 833.2198 12.78024 0.03306452 0.03343806
## 5-fold 0.1310484 4.868952 833.3226 12.67742 0.02620968 0.02756662
## Average 0.1479839 4.852016 833.2145 12.78548 0.02959677 0.02750808
## F1 nDCG rankscore
## 1-fold 0.01332506 0.1679583 0.1907407
## 2-fold 0.01691046 0.1965084 0.2187366
## 3-fold 0.01502101 0.1726703 0.2029356
## 4-fold 0.01725036 0.1902900 0.2223472
## 5-fold 0.01245742 0.1729913 0.2001172
## Average 0.01499286 0.1800837 0.2069755