Finden geeigneter Regeln für neue Daten mithilfe von Arules

11

Ich verwende R (und das Arules-Paket), um Transaktionen für Zuordnungsregeln abzubauen. Ich möchte die Regeln erstellen und sie dann auf neue Daten anwenden.

Angenommen, ich habe viele Regeln, von denen eine die kanonische ist {Beer=YES} -> {Diapers=YES}.

Dann habe ich neue Transaktionsdaten, bei denen einer der Rekorde Bier gekauft hat, aber keine Windeln. Wie kann ich eine Regel identifizieren, bei der die LHS erfüllt ist, aber noch nicht die RHS?

R Beispiel:

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

Generierte Regeln sind:

> 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

Die zweite Transaktion zeigt diesen Kunden, da er Joghurt, aber keine Vollmilch hat, sollte vielleicht ein Gutschein für Milch geschickt werden. Wie können anwendbare Regeln in "Regeln" für neue Transaktionen gefunden werden?

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

Antworten:

19

Der Schlüssel ist die is.subset-Funktion im selben Paket

Hier ist der Code ...

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)

und die generierte Ausgabe ...

> 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
quelle
Steffen - fabelhaft! Vielen Dank, ich habe diese Funktion nicht gesehen. Ich konnte diese Rangfolge anhand des Lifts (oder einer anderen Maßnahme) sehen, um zu bestimmen, welche Regel eingehalten werden sollte, wenn mehrere Spiele ziemlich einfach wären.
B_Miner
Ich bin mir bewusst, dass dies ziemlich alt ist, aber hoffentlich antwortet jemand. Was ist, wenn ich direkt setzen möchtebasket <- "tropical fruit" "yogurt" "coffee" ?
HonzaB
@ HonzaB, ich denke, Sie müssten es auf den richtigen Typ umwandeln, ala:as(list(basket), "itemMatrix")
Harlan