Одно из возможных применений алгоритма “apriori” – выдача рекомендаций.
Для тех кто знаком с методами машинного обучения первым кандидатом для
выполнения этой задачи будет метод recommend()
. Однако, в пакете arules
данный метод используется для выдачи рекомендаций по принадлежности к
определенному кластеру, а не по следующей наиболее вероятной покупке.
Ключевой функцией для выдачи рекомендаций по покупке является функция
is.subset()
.
Рассмотрим, каким образом мы можем рекомендовать очередную
возможную покупку для клиента со следующей корзиной:
library(arules)
data("Groceries")
basket <- Groceries[1]
inspect(basket)
## items ## 1 {citrus fruit,semi-finished bread,margarine,ready soups}
1. Подготовка данных
Сформируем ассоциативные правила согласно заданных параметров, только без
корзины покупок, для которой необходимо выдать рекомендацию:
rules <- apriori(Groceries[-1],
parameter = list(support=.001,
confidence=.5,
target="rules"))
## Apriori ## ## Parameter specification: ## confidence minval smax arem aval originalSupport support minlen maxlen target ext ## 0.5 0.1 1 none FALSE TRUE 0.001 1 10 rules FALSE ## ## Algorithmic control: ## filter tree heap memopt load sort verbose ## 0.1 TRUE TRUE FALSE TRUE 2 TRUE ## ## Absolute minimum support count: 9 ## ## set item appearances ...[0 item(s)] done [0.00s]. ## set transactions ...[169 item(s), 9834 transaction(s)] done [0.00s]. ## sorting and recoding items ... [157 item(s)] done [0.00s]. ## creating transaction tree ... done [0.00s]. ## checking subsets of size 1 2 3 4 5 6 done [0.02s]. ## writing ... [5668 rule(s)] done [0.00s]. ## creating S4 object ... done [0.00s].
2. Выдача рекомендаций
Функция is.subset(x,y)
ищет в множестве x
все возможные комбинации из
членов множества y
. Результатом будет вектор из TRUE
и FALSE
в позициях
множества x
, где интересующие наc подмножества существуют или не существуют:
sbs <- is.subset(rules@lhs,basket)
recommendations <- rules[sbs]@rhs
inspect(recommendations)
## items ## 1 {tropical fruit} ## 2 {whole milk} ## 3 {whole milk}
Избавится от дубликатов можно при помощи:
recommendations <- recommendations[!duplicated(recommendations)]
inspect(recommendations)
## items ## 1 {tropical fruit} ## 2 {whole milk}
3. “Оригинальные рекомендации”
Т.к. мы проверяем все возможные подмножества для интересующей нас корзины,
иногда мы можем получить в качестве рекомендации уже купленный продукт.
Следующий код поможет исключить такую ситуацию:
recommendations_c <- unlist(as(recommendations,'list'))
basket_c <- unlist(as(basket,'list'))
duplicates <- recommendations_c %in% basket_c
recommendations_c[!duplicates]
## [1] "tropical fruit" "whole milk"
4. Источники
- Cross Validated: Finding suitable rules for new data using arules
Write a comment: