การค้นหากฎที่เหมาะสมสำหรับข้อมูลใหม่โดยใช้ arules


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 ในแพ็คเกจเดียวกัน

นี่คือรหัส ...

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"

สเตฟเฟน - สุดยอด! ขอบคุณมากฉันไม่เห็นฟังก์ชั่นนั้น ฉันสามารถดูการจัดอันดับนั้นได้โดยการยก (หรือการวัดอื่น ๆ ) เพื่อกำหนดกฎที่จะรักษาเมื่อการแข่งขันหลายนัดนั้นค่อนข้างง่าย
B_Miner

ฉันรู้ว่านี่ค่อนข้างเก่า แต่หวังว่าจะมีใครตอบ ถ้าฉันต้องการที่จะนำโดยตรงbasket <- "tropical fruit" "yogurt" "coffee"?
HonzaB

@ HanzaB ฉันคิดว่าคุณจะต้องใช้มันให้ถูกประเภท ala:as(list(basket), "itemMatrix")
Harlan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.