Menemukan aturan yang cocok untuk data baru menggunakan arules

11

Saya menggunakan R (dan paket arules) untuk menambang transaksi untuk aturan asosiasi. Yang ingin saya lakukan adalah membuat aturan dan kemudian menerapkannya pada data baru.

Misalnya, saya punya banyak aturan, salah satunya kanonik {Beer=YES} -> {Diapers=YES}.

Lalu saya punya data transaksional baru di mana salah satu catatan telah membeli bir tetapi tidak popok. Bagaimana saya bisa mengidentifikasi aturan di mana LHS bertemu, tetapi belum RHS?

R contoh:

install.packages("arules")
library(arules)

data("Groceries")
**#generate Rules omitting second record**

rules <- apriori(Groceries[-2],parameter = list(supp = 0.05, conf = 0.2,target = "rules"))

Aturan yang dihasilkan adalah:

> inspect(rules)
  lhs                   rhs                   support confidence     lift
1 {}                 => {whole milk}       0.25554200  0.2555420 1.000000
2 {yogurt}           => {whole milk}       0.05603010  0.4018964 1.572722
3 {whole milk}       => {yogurt}           0.05603010  0.2192598 1.572722
4 {rolls/buns}       => {whole milk}       0.05664023  0.3079049 1.204909
5 {whole milk}       => {rolls/buns}       0.05664023  0.2216474 1.204909
6 {other vegetables} => {whole milk}       0.07484238  0.3867578 1.513480
7 {whole milk}       => {other vegetables} 0.07484238  0.2928770 1.513480

Transaksi kedua menunjukkan pelanggan ini, karena mereka memiliki yogurt tetapi tidak susu murni mungkin harus dikirim kupon untuk susu. Bagaimana aturan yang berlaku dalam "aturan" dapat ditemukan untuk transaksi baru?

> LIST(Groceries[2])
[[1]]
[1] "tropical fruit" "yogurt"         "coffee" 
B_Miner
sumber

Jawaban:

19

Kuncinya adalah fungsi is.subset dalam paket yang sama

Ini kodenya ...

basket <- Groceries[2]
# find all rules, where the lhs is a subset of the current basket
rulesMatchLHS <- is.subset(rules@lhs,basket)
# and the rhs is NOT a subset of the current basket (so that some items are left as potential recommendation)
suitableRules <-  rulesMatchLHS & !(is.subset(rules@rhs,basket))

# here they are
inspect(rules[suitableRules])

# now extract the matching rhs ...
recommendations <- strsplit(LIST(rules[suitableRules]@rhs)[[1]],split=" ")
recommendations <- lapply(recommendations,function(x){paste(x,collapse=" ")})
recommendations <- as.character(recommendations)

# ... and remove all items which are already in the basket
recommendations <- recommendations[!sapply(recommendations,function(x){basket %in% x})]

print(recommendations)

dan output yang dihasilkan ...

> inspect(rules[suitableRules])
  lhs         rhs            support confidence     lift
1 {}       => {whole milk} 0.2555420  0.2555420 1.000000
2 {yogurt} => {whole milk} 0.0560301  0.4018964 1.572722

> print(recommendations)
[1] "whole milk"
steffen
sumber
Steffen - luar biasa! Terima kasih banyak, saya tidak melihat fungsi itu. Saya bisa melihat peringkat itu dengan lift (atau ukuran lain) untuk menentukan aturan mana yang harus dipertahankan ketika beberapa pertandingan akan cukup mudah.
B_Miner
Saya sadar ini sudah cukup tua, tapi semoga seseorang merespons. Bagaimana jika saya ingin langsung dimasukkan basket <- "tropical fruit" "yogurt" "coffee"?
HonzaB
@HonzaB, saya pikir Anda perlu memberikannya ke tipe yang tepat, ala:as(list(basket), "itemMatrix")
Harlan