Khai phá luật kết hợp với R
Association Rule Mining with R
chuc1803@gmail.com
Khai phá luật kết hợp (Association Rule Mining) là kỹ thuật rất quan trọng trong lĩnh vực khai phá dữ liệu. Mục đích của việc khai phá luật kết hợp là tìm ra các mối quan hệ, sự kết hợp hay mối tương quan giữa các đối tượng trong khối lượng lớn dữ liệu (xem thêm về luật kết hợp tại http://bis.net.vn/forums/t/389.aspx).
Bài viết này giới thiệu cách khai phá luật kết hợp với ngôn ngữ R.
Data set minh họa: Titanic Dataset. (Đây là bộ dữ liệu về số phận của 2201 hành khách trên tàu Titanic theo 4 thuộc tính gồm social class (tầng lớp xã hội), sex (giới tính), age (tuổi), survival (sống sót). Khi nghiên cứu dữ liệu về thảm họa chìm tàu Titanic vào ngày 14 tháng 04 năm 1912 làm 1514 người chết, một số câu hỏi được đặt ra là:Trẻ con có tỷ lệ sống sót cao hơn người lớn không? Những đứa trẻ có tầng lớp xã hội thượng lưu có tỷ lệ sống sót cao hơn trẻ con của các tầng lớp khác không? Tỷ lệ sống sót có phụ thuộc vào gới tính và độ tuổi không?... Để trả lời các câu hỏi này, người ta đã sử dụng kỷ thuật phát hiện luật kết hợp để khai phá tri thức tiềm ẩn trong dataset Titanic.
Download Titanic dataset tại ĐÂY
Download Code R để thực hiện tại ĐÂY
Các bước thực hiện khai phá luật kết hợp với R
Bước 1. Load và xem qua dữ liệu
#Load the Titanic dataset
setwd("D:/R")
load("titanic.raw.rdata")
#Quick view about the dataset
fix(titanic.raw)
dim(titanic.raw)
str(titanic.raw)
#Show 5 rows of the dataset
idx <- sample(1:nrow(titanic.raw),5)
titanic.raw[idx, ]
#show summary of the dataset
summary(titanic.raw)
Bước 2. Sử dụng thuật toán Apriori trong gói arules để phát hiện luật kết hợp Các thiết lập mặc định của thuật toán phát hiện luật kết hợp Apriori:
minimum support: supp=0.1; minimum confidence: conf=0.8; maximum length of rules: maxlen=10
#install packages "arules"
install.packages("arules")
#load required library
library(arules)
rules.all <- apriori(titanic.raw) # run the APRIORI algorithm
length(rules.all) # Number of rules
inspect(rules.all) #show the rules
Có tất cả 27 luật được phát hiện như hình trên. Giả sử rằng chúng ta muốn tìm các luật chỉ chứa "Survived" bên vế phải của luật (rhs :right- hand side) với ít nhất 2 items (minlen=2), với supp=0.005 và conf=0.8 ta sử dụng lệnh sau:
# run APRIORI again to find rules with rhs containing "Survived" only
rules.surv <- apriori(titanic.raw, control = list(verbose=F), parameter =list(minlen=2, supp=0.005, conf=0.8), appearance = list(rhs=c("Survived=No", "Survived=Yes"), default="lhs"))
Xem kết quả các luật phát hiện được
#keep three decimal places
quality(rules.surv) <- round(quality(rules.surv),digits=3)
#sort rules by lift
rules.surv.sorted <- sort(rules.surv,by="lift")
inspect(rules.surv.sorted) # print rules
Bước 3. Loại bỏ các luật thừa Thông thường các luật được phát hiện từ dataset là rất lớn và có rất nhiều luật thừa (trùng với các luật khác) vì vậy ta phải loại bỏ các luật thừa trước khi nghiên cứu các luật.
Xem 2 luật đầu tiên sau khi đã sắp xếp giảm dần theo lift
Với 2 luật trên ta thấy luật thứ 2 (Rule #2) không cung cấp tri thức gì thêm so với Rule #1, vì theo Rule #1 thì tất cả các hành khách thuộc tầng lớp 2nd-class là trẻ con thì sống sót (Survived =Yes). Cả 2 luật đều có confident và life như nhau. Trong trường hợp này Rule #2 được xem là thừa. Kiểm tra tất cả các luật được phát hiện, có thể thấy Rule #4, #7 và #8 có thể xem là thừa khi so sánh với Rule #3, #6 và #5. Tìm các luật thừa
# find redundant rules
subset.matrix <- is.subset(rules.surv.sorted, rules.surv.sorted)
subset.matrix[lower.tri(subset.matrix, diag = T)] <- F
redundant <- colSums(subset.matrix) >= 1
#which rules are redundant
which(redundant)
Các luật #2,#4,#7 và #8 là các luật thừa Loại bỏ các luật thừa
# remove redundant rules
rules.surv.pruned <- rules.surv.sorted[!redundant]
inspect(rules.surv.pruned) ## print rules
Các luật còn lại sau khi loại bỏ các luật thừa. inspect(rules.surv.pruned[1]) ## print 1st rules
Tìm các luật liên quan đến nhóm tuổi #Find Rules about Age Groups
rules.age <- apriori(titanic.raw,control = list(verbose=F),
parameter = list(minlen=3, supp=0.002, conf=0.2),
appearance = list(default="none", rhs=c("Survived=Yes"),
lhs=c("Class=1st", "Class=2nd", "Class=3rd",
"Age=Child", "Age=Adult")))
rules.age <- sort(rules.age, by="confidence")
inspect(rules.age)
Tỷ lệ sống sót
Bước 4. Trực quan hóa các luật kết hợp (Visualizing Association Rules)Để dễ hình dung và giải thích các luật kết hợp phát hiện được, ta sử dụng gói arulesViz để biểu diễn các luật dưới dạng trực quan.
#Install and load requirement packages
install.packages("arulesViz")
library(arulesViz)
plot(rules.all)
plot(rules.surv,method = "grouped")
{Class=1st, Sex=Female, +1 items}=>{Survived=Yes}
plot(rules.surv,method="graph", control=list(layout=igraph::with_fr()))
plot(rules.surv,method="graph", control=list(layout=igraph::in_circle()))
plot(rules.surv,method="paracoord", control=list(reorder=T))
XEM CLIP HƯỚNG DẪN KHAI PHÁ LUẬT KẾT HỢP VỚI R Ở ĐÂY