Search code examples
raprioriarules

R pruning rules in a priori


I am doing data mining with rules asociation using a priori (library arules) in r.

I want to convert a factor in dummy variables, e. g., color = {red, blue, green} I'll do three new variables that for each instance will be like (red= Yes, blue=No, green=No).

When I do a priori I have the problem of redundant rules like red=Yes => green=No or {red=Yes, green=No} => {one arbitrary irrelevant thing}.

How can I prune the rules to not obtain these redundancies? The dataset is pima indians diabetes (a quite famous and typical dataset).

library(arules)

pima<-read.csv("pima.dat",header=F,comment.char = "@")
names(pima)<-names(pima) <-c("Preg", "Plas", "Pres", "Skin", "Insu", "Mass", "Pedi", "Age", "Class")



pima$Plas<-ifelse(pima$Plas==0&pima$Class=="tested_negative",floor(mean(pima$Plas[pima$Plas!=0&pima$Class=="tested_negative"])),floor(pima$Plas))
pima$Plas<-ifelse(pima$Plas==0&pima$Class=="tested_positive",floor(mean(pima$Plas[pima$Plas!=0&pima$Class=="tested_positive"])),floor(pima$Plas))

pima$Pres<-ifelse(pima$Pres==0&pima$Class=="tested_negative",floor(mean(pima$Pres[pima$Pres!=0&pima$Class=="tested_negative"])),floor(pima$Pres))
pima$Pres<-ifelse(pima$Pres==0&pima$Class=="tested_positive",floor(mean(pima$Pres[pima$Pres!=0&pima$Class=="tested_positive"])),floor(pima$Pres))

pima$Skin<-ifelse(pima$Skin==0&pima$Class=="tested_negative",floor(mean(pima$Skin[pima$Skin!=0&pima$Class=="tested_negative"])),floor(pima$Skin))
pima$Skin<-ifelse(pima$Skin==0&pima$Class=="tested_positive",floor(mean(pima$Skin[pima$Skin!=0&pima$Class=="tested_positive"])),floor(pima$Skin))

pima$Insu<-ifelse(pima$Insu==0&pima$Class=="tested_negative",floor(mean(pima$Insu[pima$Insu!=0&pima$Class=="tested_negative"])),floor(pima$Insu))
pima$Insu<-ifelse(pima$Insu==0&pima$Class=="tested_positive",floor(mean(pima$Insu[pima$Insu!=0&pima$Class=="tested_positive"])),floor(pima$Insu))

pima$Mass<-ifelse(pima$Mass==0&pima$Class=="tested_negative",floor(mean(pima$Mass[pima$Mass!=0&pima$Class=="tested_negative"])),floor(pima$Mass))
pima$Mass<-ifelse(pima$Mass==0&pima$Class=="tested_positive",floor(mean(pima$Mass[pima$Mass!=0&pima$Class=="tested_positive"])),floor(pima$Mass))

#Discretización de las variables
pima[[ "Age"]] = ordered( cut ( pima[[ "Age"]], c(21,30,45,65,100) ) ,
                              labels = c ("Joven", "Mediana edad", "Mayor", "Viejo"))
pima[[ "Preg"]] = ordered( cut ( pima[[ "Preg"]], c(0,0.9,4,8,20),right=FALSE, include.lowest = TRUE ) ,
                          labels = c ("Ningún embarazo", "Pocos embarazos", "Bastantes embarazos", "Muchos embarazos"))
pima[[ "Pres"]] = ordered( cut ( pima[[ "Pres"]], c(0,70,92,102,110,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("hipotensión", "tensión normal", "hipertensión leve", "hipertensión media-grave", "hipertensión grave"))
pima[[ "Insu"]] = ordered( cut ( pima[[ "Insu"]], c(0,16,166,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("Insulina baja", "Insulina normal", "Insulina alta"))
pima[[ "Mass"]] = ordered( cut ( pima[[ "Mass"]], c(0,18.5,25,30,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("Bajo peso", "Peso normal", "Sobrepeso","Obesidad"))
pima[[ "Plas"]] = ordered( cut ( pima[[ "Plas"]], c(0,140,192,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("Glucosa normal", "Glucosa alta", "Glucosa muy alta"))
pima[[ "Pedi"]] = ordered( cut ( pima[[ "Pedi"]], c(0,0.37,0.6,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("Función pedigree baja", "Función pedigree normal", "Función pedigree alta"))
pima[[ "Skin"]] = ordered( cut ( pima[[ "Skin"]], c(0,15,40,Inf),right=FALSE, include.lowest = TRUE ) ,
                           labels = c ("Bajo espesor de piel", "Espesor de piel normal", "Espesor de piel alto"))
pima$Class = factor(ifelse(pima$Class=="tested_positive","Diabético","No diabético"))


library(psych)
new <- dummy.code(pima_df$Preg)
pima_df <- data.frame(new,pima_df)


pima_df<-pima_df[,-5]


pima_df[,1] <- factor(ifelse(pima_df[,1]==0, 'No', 'Sí'))
pima_df[,2] <- factor(ifelse(pima_df[,2]==0, 'No', 'Sí'))
pima_df[,3] <- factor(ifelse(pima_df[,3]==0, 'No', 'Sí'))
pima_df[,4] <- factor(ifelse(pima_df[,4]==0, 'No', 'Sí'))




pima2 <- as(pima_df, "transactions")



rules_negadas <- apriori(pima2, parameter = list(support = 0.1, confidence = 0.8, minlen = 2))
summary(rules_negadas)
inspect(head(rules_negadas))
quality(head(rules_negadas))
#Ordenar las reglas por el campo que más nos interese por ejemplo confianza
rulesSorted_negadas = sort(rules_negadas, by = "confidence")
inspect(head(rulesSorted_negadas,20))

Solution

  • Do not create dummy variables. Leave color as a factor and the conversion into transactions will create the appropriate items (color=red, color=blue and color=green).

    If you already have dummy variables, but you don't want the negative values to become items then convert them into logical. Example :pima_df[,1] <- pima_df[,1] == 'Si'

    Have a look at the examples in ?transactions and at https://rawgit.com/mhahsler/Introduction_to_Data_Mining_R_Examples/master/chap6.html#create-transactions to learn more about this.

    If you want green=yes and red=no, just not in the same rule, then you are in trouble because that is not something you can easily enforce in association rule mining.