Создание класса «транзакций» для Ассоциации Rule Mining в SparkR с использованием arules и apriori - PullRequest
0 голосов
/ 17 октября 2018

Я использую SparkR и пытаюсь преобразовать «SparkDataFrame» в «транзакции», чтобы найти ассоциацию товаров / продуктов.

Я нашел похожий пример по этой ссылке https://blog.aptitive.com/building-the-transactions-class-for-association-rule-mining-in-r-using-arules-and-apriori-c6be64268bc4но это только если вы работаете с R data.frame.В настоящее время у меня есть данные в этом формате;

CUSTOMER_KEY_h PRODUCT_CODE

    1   SAVE
    1   CHEQ
    1   LOAN
    1   LOAN
    1   CARD
    1   SAVE
    2   CHEQ
    2   LOAN
    2   CTSAV
    2   SAVE
    2   CHEQ
    2   SAVE
    2   CARD
    2   CARD
    3   LOAN
    3   CTSAV
    4   SAVE
    5   CHEQ
    5   SAVE
    5   CARD
    5   LOAN
    5   CARD
    6   CHEQ
    6   CHEQ

, и я хотел бы получить что-то вроде этого;

CUSTOMER_KEY_h  PRODUCT_CODE
    1          {SAVE, CHEQ, LOAN, LOAN , CARD, SAVE}
    2          {CHEQ, LOAN, CTSAV, SAVE, CHEQ, SAVE, CARD, CARD}
    3          {LOAN, CTSAV}
    4          {SAVE}
    5          {CHEQ, SAVE, CARD, LOAN, CARD}
    6          {CHEQ, CHEQ}

В качестве альтернативы, если я смогу получить эквивалент этого сценария Rв SparkR df2 <- apply(df,2,as.logical) это было бы полезно.

1 Ответ

0 голосов
/ 18 октября 2018

arules пакет не совместим с SparkR.Если вы хотите изучить правила ассоциации на Spark, вы должны использовать его собственные утилиты.Сначала используйте collect_set для объединения записей:

library(magrittr)

df <- createDataFrame(data.frame(
  CUSTOMER_KEY_h = c(
    1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 6, 6),
  PRODUCT_CODE = c(
    "SAVE","CHEQ","LOAN","LOAN","CARD","SAVE","CHEQ","LOAN","CTSAV","SAVE",
    "CHEQ","SAVE","CARD","CARD","LOAN","CTSAV","SAVE","CHEQ","SAVE","CARD","LOAN",
    "CARD","CHEQ","CHEQ")
))

baskets <- df %>% 
  groupBy("CUSTOMER_KEY_h") %>% 
  agg(alias(collect_set(column("PRODUCT_CODE")), "items"))

Установите модель (пожалуйста, проверьте spark.fpGrowth документы для получения полного списка доступных опций):

fpgrowth <- spark.fpGrowth(baskets)

и используйте его для извлечения правил ассоциации:

arules <- fpgrowth <- spark.fpGrowth(baskets)

arules %>% head()
        antecedent consequent confidence lift                                   
1       CARD, LOAN       SAVE          1  1.5
2       CARD, LOAN       CHEQ          1  1.5
3 LOAN, SAVE, CHEQ       CARD          1  2.0
4       SAVE, CHEQ       LOAN          1  1.5
5       SAVE, CHEQ       CARD          1  2.0
6       CARD, SAVE       LOAN          1  1.5

Если вы используете Spark <2.3.0, вы можете попробовать заменить: </p>

alias(collect_set(column("PRODUCT_CODE")), "items")

на

expr("collect_set(PRODUCT_CODE) AS items")
...