Encontrar reglas adecuadas para nuevos datos usando arules

11

Estoy usando R (y el paquete arules) para minar transacciones para reglas de asociación. Lo que deseo hacer es construir las reglas y luego aplicarlas a los nuevos datos.

Por ejemplo, digamos que tengo muchas reglas, una de las cuales es la canónica {Beer=YES} -> {Diapers=YES}.

Luego tengo nuevos datos transaccionales donde uno de los registros ha comprado cerveza pero no pañales. ¿Cómo puedo identificar una regla donde se cumple el LHS, pero aún no el RHS?

R ejemplo:

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

Las reglas generadas son:

> 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 segunda transacción muestra a este cliente, ya que tiene yogur pero no leche entera, tal vez debería enviarse un cupón para la leche. ¿Cómo pueden ubicarse las reglas aplicables en "reglas" para nuevas transacciones?

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

Respuestas:

19

La clave es la función is.subset en el mismo paquete

Aquí está el código ...

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)

y la salida generada ...

> 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
fuente
Steffen - fabuloso! Muchas gracias, no vi esa función. Pude ver esa clasificación por elevación (u otra medida) para determinar qué regla mantener cuando varias coincidencias serían bastante fáciles.
B_Miner
Soy consciente de que esto es bastante antiguo, pero espero que alguien responda. ¿Qué pasa si quiero poner directamente basket <- "tropical fruit" "yogurt" "coffee"?
HonzaB
@HonzaB, creo que tendrías que lanzarlo al tipo correcto, ala:as(list(basket), "itemMatrix")
Harlan