MAP

class rectools.metrics.ranking.MAP(k: int, divide_by_k: bool = False)[source]

Bases: _RankingMetric

Mean Average Precision at k (MAP@k).

Mean AP calculates as mean value of AP among all users.

Average Precision estimates precision of recommendations taking into account their order.

\[AP@k = (\sum_{i=1}^{k+1} p@i * rel(i)) / divider\]
where
  • p@i is precision at i, see Precision metric documentation for details;

  • rel(i) is an indicator function, it equals to 1 if the item at rank i is relevant, 0 otherwise;

  • divider can be equal to k or be equal to number of relevant items per user, depending on divide_by_k parameter.

Parameters
  • k (int) – Number of items at the top of recommendations list that will be used to calculate metric.

  • divide_by_k (bool, default False) – If True, k will be used as divider in AP@k. If False, number of relevant items for each user will be used.

Examples

>>> reco = pd.DataFrame(
...     {
...         Columns.User: [1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4],
...         Columns.Item: [7, 8, 1, 2, 1, 2, 3, 4, 1, 2, 3],
...         Columns.Rank: [1, 2, 1, 2, 1, 2, 3, 4, 1, 2, 3],
...     }
... )
>>> interactions = pd.DataFrame(
...     {
...         Columns.User: [1, 1, 2, 3, 3, 3, 4, 4, 4],
...         Columns.Item: [1, 2, 1, 1, 3, 4, 1, 2, 3],
...     }
... )
>>> # Here
>>> #    - for user ``1`` we return non-relevant recommendations;
>>> #    - for user ``2`` we return 2 items and relevant is first;
>>> #    - for user ``3`` we return 4 items, 1st, 3rd and 4th are relevant;
>>> #    - for user ``4`` we return 3 items and all are relevant;
>>> MAP(k=1).calc_per_user(reco, interactions).values
array([0. , 1. , 0.33333333, 0.33333333])
>>> MAP(k=3).calc_per_user(reco, interactions).values
array([0. , 1. , 0.55555556, 1. ])
>>> MAP(k=1, divide_by_k=True).calc_per_user(reco, interactions).values
array([0., 1., 1., 1.])
>>> MAP(k=3, divide_by_k=True).calc_per_user(reco, interactions).values
array([0. , 0.33333333, 0.55555556, 1. ])
Inherited-members

Parameters
  • k (int) –

  • divide_by_k (bool) –

Methods

calc(reco, interactions)

Calculate metric value.

calc_from_fitted(fitted)

Calculate metric value from fitted data.

calc_per_user(reco, interactions)

Calculate metric values for all users.

calc_per_user_from_fitted(fitted)

Calculate metric values for all users from fitted data.

fit(merged, k_max)

Prepare intermediate data for effective calculation.

Attributes

divide_by_k

calc_from_fitted(fitted: MAPFitted) float[source]

Calculate metric value from fitted data.

For parameters used result of fit method.

Parameters

fitted (MAPFitted) – Meta data that got from .fit method.

Returns

Value of metric (average between users).

Return type

float

calc_per_user(reco: DataFrame, interactions: DataFrame) Series[source]

Calculate metric values for all users.

Parameters
  • reco (pd.DataFrame) – Recommendations table with columns Columns.User, Columns.Item, Columns.Rank.

  • interactions (pd.DataFrame) – Interactions table with columns Columns.User, Columns.Item.

Returns

Values of metric (index - user id, values - metric value for every user).

Return type

pd.Series

calc_per_user_from_fitted(fitted: MAPFitted) Series[source]

Calculate metric values for all users from fitted data.

For parameters used result of fit method.

Parameters

fitted (MAPFitted) – Meta data that got from .fit method.

Returns

Values of metric (index - user id, values - metric value for every user).

Return type

pd.Series

classmethod fit(merged: DataFrame, k_max: int) MAPFitted[source]

Prepare intermediate data for effective calculation.

You can use this method to prepare some intermediate data for later calculation. It can optimize calculations if you want calculate metric value for different k.

Parameters
  • merged (pd.DataFrame) – Result of merging recommendations and interactions tables. Can be obtained using merge_reco function.

  • k_max (int) – k is number of items at the top of recommendations list that will be used to calculate metric. So k_max is maximum number of items for which you want to calculate metric.

Return type

MAPFitted