Índice

O Que é Mean Average Precision?

Mean Average Precision (MAP) é uma métrica de avaliação em machine learning comumente usada para medir a performance de sistemas de recomendação e busca.

Um outro caso de uso interessante é na avaliação de modelos de segmentação de imagem, onde você precisa detectar e segmentar vários objetos em uma mesma imagem.

Uma analogia mais divertida para lembrar o que é a MAP é a seguinte:

Imagine que você está organizando um jogo de caça ao tesouro.

bau de tesouro

Você escondeu vários tesouros em diferentes locais e os jogadores têm que encontrá-los.

O objetivo é encontrar o maior número de tesouros possível, mas também é importante encontrá-los rapidamente.

A MAP é como a pontuação final do jogo, levando em conta tanto a quantidade de tesouros encontrados quanto o tempo gasto para encontrá-los.

Ela leva em conta a ordem dos itens recomendados e não apenas a quantidade de itens relevantes retornados.

Um sistema de recomendação que coloca itens relevantes no início dos resultados terá um MAP maior do que outro que os coloca no final.

Qual a Fórmula da Mean Average Precision?

A fórmula da MAP é a média aritmética das Average Precisions (AP) de cada lista de resultados retornada pelo modelo.

Nestes exemplos vou tratar cada lista como recomendações para um usuário.

Fórmula da Mean Average Precision - map

Onde:

  • |U| é o número total de usuários
  • u é o usuário atual
  • |N| é o número total de itens relevantes para o usuário u
  • n é o número de itens recomendados para o usuário u
  • P(i, u) é a precisão para a posição i e usuário u
  • rel(i, u) é a relevância do item na posição i para o usuário u (1 para relevante e 0 para irrelevante)
  • min(|N|, n) retorna o menor valor entre o total de itens relevantes que poderíamos recomendar e o tamanho da lista de recomendações

Preste atenção que a MAP só considera a precisão de posições com itens relevantes.

A precisão de posições com itens irrelevantes é zerada.

Como você pode ver, a fórmula da MAP envolve duas médias: a média aritmética das Average Precisions e a média das listas de resultados.

Em português seria algo como: “a média aritmética das precisões médias”.

No caso, a “mean” significa a média externa, calculada sobre as APs de cada lista de resultados.

E a “average” significa a média interna, calculada sobre cada lista de resultados.

Vamos entender melhor com um exemplo na próxima seção.

Como Interpretar a Mean Average Precision?

Primeiro precisamos calcular a Average Precision (AP).

A Average Precision (AP) é calculada sequencialmente sobre cada lista de itens recomendados pelo modelo.

Vamos entender melhor com um exemplo:

Posição Item Recomendado Relevante? - rel(i,u) Precisão - P(i,u)
1 A 1 1
2 B 0 0
3 C 1 0,67
4 D 0 0
5 E 0 0

O exemplo acima mostra como calcular a Average Precision usando uma tabela com cinco itens recomendados pelo sistema e sua relevância para o usuário.

Os itens podem ser produtos de supermercado, filmes, músicas, vídeos, resultados de busca, etc.

A relevância poderia ser um número qualquer (como uma nota de uma a cinco estrelas), mas você precisa definir um limiar para determinar se um item é relevante ou não.

A Average Precision precisa de relevâncias binárias, ou seja, 1 se o item é relevante e 0 se não é relevante.

Na primeira posição, o item recomendado é A e ele é relevante, então a precisão é 1/1 * 1 (um item relevante de um recomendado multiplicado pela relevância do item desta posição).

Na segunda posição, o item recomendado é B e não é relevante, então apesar da precisão ser 1/2 (um item relevante de dois recomendados), ela é zerada porque o item da posição 2 não é relevante.

Na terceira posição, o item recomendado é relevante, então a precisão é calculada como 2/3 * 1 = 0,67 (dois itens relevantes de três recomendados).

Nas quarta e quinta posições, os itens recomendados D e E não são relevantes, então a precisão fica zerada.

Para calcular a AP, você soma a precisão de cada posição e divide pelo mínimo entre a quantidade de itens relevantes que poderiam ser recomendados e o tamanho da lista.

Neste caso, se apenas os itens A e C forem relevantes para este usuário considerando todo o catálogo de itens, a AP é 1,67 / 2 = 0,835.

Se o catálogo tiver 3 itens relevantes (A, B e F), mas um deles não foi recomendado, a AP seria 1,67 / 3 = 0,557.

Agora suponha que o catálogo de itens tenha 6 itens relevantes para este usuário.

Como a lista pode ter apenas 5 itens, a AP ficaria em 1,67 / 5 = 0,334.

Isso faz com que a MAP sempre retorne um valor entre 0 e 1.

Sendo 0 o pior valor possível e 1 o melhor valor possível.

No fim, você calcula a média das APs de cada lista de resultados do seu conjunto total de usuários.

Como Calcular a Mean Average Precision em Python?

Apesar do scikit-learn ter uma função para calcular a MAP, ela não é muito intuitiva.

As funções do scikit-learn devem seguir um padrão, o que acaba tornando algumas delas mais complicadas do que deveriam ser.

Por isso, vamos implementar a MAP em Python puro.

recomendacoes = [[1,2,3,4,5],
                [3,4,2,1,5],
                [5,4,3,2,1]]

itens_relevantes = [[1,3,7,8,9,10], 
                    [4,5], 
                    [3,1,7,9]]

lista_precisoes = list()

for u, lista in enumerate(recomendacoes):
    ap = 0
    contagem_relevantes = 0
    contagem_total = 0
    for i in range(len(lista)):
        contagem_total += 1
        if lista[i] in itens_relevantes[u]:
            contagem_relevantes += 1
            ap += contagem_relevantes / contagem_total
    ap = ap / min(len(itens_relevantes[u]), len(lista))
    lista_precisoes.append(ap)
map = sum(lista_precisoes) / len(lista_precisoes)

Na prática você terá várias listas de itens recomendados e relevantes que podem ser, por exemplo, de usuários diferentes.

Vamos simular esse cenário usando as variáveis recomendacoes e itens_relevantes.

Cada linha representa um usuário diferente, então temos um total de três usuários.

O conjunto de itens relevantes é diferente para cada usuário.

Num sistema de recomendação de filmes, por exemplo, alguns usuários preferem filmes de ação, outros preferem comédias, outros preferem filmes de terror e assim vai.

A variável lista_precisoes é uma lista vazia que vai armazenar a AP de cada usuário.

Vamos processar uma lista por vez no loop for u, lista in enumerate(recomendacoes):.

Dentro desse loop principal, temos outro loop for i in range(len(lista)):, que vai percorrer cada lista, verificando se cada item recomendado está na lista de relevantes.

Para cada item recomendado verificado, adicionamos 1 à variável contagem_total.

Esse é apenas um contador para sabermos em qual posição estamos.

Caso o item recomendado esteja na lista de relevantes, adicionamos 1 à variável contagem_relevantes.

Esta é a contagem de quantos itens relevantes foram recomendados até o momento.

Além disso, calculamos a precisão para aquela posição, que é a proporção de itens relevantes encontrados até a posição atual, e adicionamos à variável ap.

Note que quando o item é irrelevante nós não somamos nada à variável ap.

Após verificarmos toda a lista do usuário atual, calculamos a Average Precision dividindo a variável ap pelo mínimo entre número de itens relevantes possíveis e o tamanho da lista de recomendações min(len(itens_relevantes[u]), len(lista)).

Adicionamos esse valor à lista lista_precisoes para, no fim, calcular a média das APs de todos os usuários e finalmente obter a MAP.

Qual a Diferença Entre Mean Average Precision e NDCG?

Expliquei a diferença entre Mean Average Precision e NDCG neste post.

Qual a Diferença Entre Mean Average Precision e Mean Reciprocal Rank?

Expliquei a diferença entre Mean Average Precision e Mean Reciprocal Rank neste post.

Seja o primeiro a saber das novidades em Machine Learning. Me siga no LinkedIn.