Trovare regole adatte per nuovi dati usando arules


11

Sto usando R (e il pacchetto Arules) per estrarre transazioni per regole di associazione. Quello che desidero fare è costruire le regole e quindi applicarle a nuovi dati.

Ad esempio, supponiamo che io abbia molte regole, una delle quali è quella canonica {Beer=YES} -> {Diapers=YES}.

Poi ho nuovi dati transazionali in cui uno dei dischi ha acquistato birra ma non pannolini. Come posso identificare una regola in cui viene rispettato l'LHS, ma non ancora l'RHS?

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

Le regole generate sono:

> 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

La seconda transazione mostra questo cliente, dal momento che hanno yogurt ma non latte intero forse dovrebbe essere inviato un coupon per il latte. Come si possono individuare eventuali regole applicabili in "regole" per le nuove transazioni?

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

Risposte:


19

La chiave è la funzione is.subset nello stesso pacchetto

Ecco il codice ...

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)

e l'output generato ...

> 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 - favoloso! Grazie mille, non ho visto quella funzione. Ho potuto vedere quella classifica per ascensore (o altra misura) per determinare quale regola mantenere quando diverse partite sarebbero abbastanza facili.
B_Miner,

Sono consapevole che questo è piuttosto vecchio, ma spero che qualcuno risponda. E se volessi metterlo direttamente basket <- "tropical fruit" "yogurt" "coffee"?
HonzaB,

@HonzaB, penso che avresti bisogno di lanciarlo nel tipo giusto, ala:as(list(basket), "itemMatrix")
Harlan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.