규칙을 사용하여 새 데이터에 적합한 규칙 찾기


11

R (및 arules 패키지)을 사용하여 연결 규칙에 대한 마이닝 트랜잭션을 사용하고 있습니다. 내가하고 싶은 것은 규칙을 구성 한 다음 새로운 데이터에 적용하는 것입니다.

예를 들어, 많은 규칙이 있는데 그 중 하나는 표준 규칙 {Beer=YES} -> {Diapers=YES}입니다.

그런 다음 레코드 중 하나가 맥주를 구입했지만 기저귀는 구입하지 않은 새로운 거래 데이터가 있습니다. LHS가 충족되었지만 아직 RHS가 아닌 규칙을 어떻게 식별 할 수 있습니까?

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

생성 된 규칙은 다음과 같습니다.

> 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

두 번째 거래는이 고객에게 요구르트가 있지만 전유가 아닌 우유에 대한 쿠폰을 보내야하므로이 고객을 보여줍니다. 새로운 거래에 대해 "규칙"의 해당 규칙을 어떻게 찾을 수 있습니까?

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

답변:


19

핵심은 동일한 패키지에있는 is.subset-function입니다.

코드는 다음과 같습니다.

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)

그리고 생성 된 출력 ...

> 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-훌륭합니다! 고마워요, 그 기능을 보지 못했습니다. 몇 번의 경기가 아주 쉬울 때 유지할 규칙을 결정하기 위해 리프트 (또는 다른 측정 기준)에 의한 순위를 볼 수 있습니다.
B_Miner

나는 이것이 꽤 오래되었다는 것을 알고 있지만 희망적으로 누군가가 응답합니다. 직접 넣고 싶다면 어떻게해야 basket <- "tropical fruit" "yogurt" "coffee"합니까?
HonzaB

@ HonzaB, 나는 당신이 그것을 올바른 유형, ala로 캐스팅해야한다고 생각합니다 :as(list(basket), "itemMatrix")
Harlan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.