Tìm quy tắc phù hợp cho dữ liệu mới bằng cách sử dụng arules


11

Tôi đang sử dụng R (và gói arules) để khai thác các giao dịch cho các quy tắc kết hợp. Những gì tôi muốn làm là xây dựng các quy tắc và sau đó áp dụng chúng cho dữ liệu mới.

Ví dụ, giả sử tôi có nhiều quy tắc, một trong số đó là quy tắc {Beer=YES} -> {Diapers=YES}.

Sau đó, tôi có dữ liệu giao dịch mới, trong đó một trong những hồ sơ đã mua bia nhưng không phải tã. Làm cách nào tôi có thể xác định quy tắc nơi LHS được đáp ứng, nhưng chưa phải là RHS?

Ví dụ R:

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"))

Các quy tắc được tạo là:

> 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

Giao dịch thứ hai cho thấy khách hàng này, vì họ có sữa chua nhưng không phải sữa nguyên chất có lẽ nên được gửi một phiếu giảm giá cho sữa. Làm thế nào có thể đặt bất kỳ quy tắc áp dụng nào trong "quy tắc" cho các giao dịch mới?

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

Câu trả lời:


19

Chìa khóa là hàm is.subset trong cùng một gói

Đây là mã ...

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)

và đầu ra được tạo ...

> 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 - tuyệt vời! Cảm ơn rất nhiều, tôi đã không thấy chức năng đó. Tôi có thể thấy rằng xếp hạng bằng thang máy (hoặc biện pháp khác) để xác định quy tắc nào cần giữ khi một vài trận đấu sẽ khá dễ dàng.
B_Miner

Tôi biết rằng điều này là khá cũ, nhưng hy vọng ai đó đáp ứng. Nếu tôi muốn đặt trực tiếp basket <- "tropical fruit" "yogurt" "coffee"thì sao?
HonzaB

@HonzaB, tôi nghĩ bạn sẽ cần phải chọn đúng loại, ala:as(list(basket), "itemMatrix")
Harlan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.