Правило ассоциации в R — удаление избыточного правила (arules)

Предположим, у нас есть 3 правила:

[1] {A,B,D} -> {C}

[2] {A,B} -> {C}

[3] Whatever it is

Правило [2] является подмножеством правила [1] (поскольку правило [1] содержит все элементы правила [2]), поэтому правило [1] следует исключить (поскольку правило [1] слишком специфично и его информация включена в правило [2]).

Я искал в Интернете, и все используют этот код для удаления избыточных правил:

subset.matrix <- is.subset(rules.sorted, rules.sorted)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
which(redundant)
rules.pruned <- rules.sorted[!redundant]

Я не понимаю, как работает код.

После строки 2 кода subset.matrix станет:

      [,1] [,2] [,3]
[1,]   NA    1    0
[2,]   NA   NA    0
[3,]   NA   NA   NA

Для ячеек в нижнем треугольнике установлено значение NA, и, поскольку правило [2] является подмножеством правила [1], для соответствующей ячейки установлено значение 1. Итак, у меня есть 2 вопроса:

  1. Почему мы должны установить нижний треугольник как NA? Если мы это сделаем, то как мы можем проверить, является ли правило [2] подмножеством правила [3] или нет? (ячейка была установлена ​​как NA)

  2. В нашем случае должно быть исключено правило [1], но этот код исключает правило [2] вместо правила [1]. (Поскольку первая ячейка в столбце 2 равна 1, и, согласно строке 3 кода, суммы столбцов столбца 2 >= 1, поэтому будут рассматриваться как избыточные)

Любая помощь будет оценена!


person BigData    schedule 05.08.2016    source источник


Ответы (3)


Чтобы ваш код работал, вам нужна процентная мера (уверенность или подъем), а rules.sorted нужно отсортировать либо по достоверности, либо по подъему. В любом случае код ужасно неэффективен, так как is.subset() создает матрицу размера n^2, где n — количество правил. Кроме того, is.subset для правил объединяет правую и левую стороны правила, что неверно. Так что не беспокойтесь о деталях реализации.

Более эффективный способ сделать это теперь реализован как функция is.redundant() в пакетных правилах (доступно в версии 1.4-2). Это объяснение взято со страницы руководства:

Правило является избыточным, если существует более общее правило с такой же или большей достоверностью. То есть более конкретное правило является излишним, если оно дает такой же или даже меньший прогноз, чем более общее правило. Правило является более общим, если оно имеет ту же самую правую часть, но один или несколько элементов удалены из левой части. Формально правило X -> Y избыточно, если

для некоторого подмножества X X conf(X' -> Y) >= conf(X -> Y).

Это эквивалентно отрицательному или нулевому улучшению, как это определено Bayardo et al. (2000). В этой реализации другие меры, кроме уверенности, например. улучшение подъемной силы, также может быть использовано.

Посмотрите примеры в ? is.redundant.

person Michael Hahsler    schedule 06.08.2016
comment
Я не знал, что есть такая функция. Спасибо за вашу полезную информацию. - person BigData; 07.08.2016
comment
Что делать, если у меня есть такие правила, как A -> B и B -> A, как я могу удалить одно из них? Так как один из них лишний. is.redundant кажется, не может этого сделать. - person BigData; 07.08.2016
comment
Как узнать, какой из них вы хотите удалить, а какой оставить? Они оба будут иметь одинаковую поддержку и подъемную силу. Я думаю, вы могли бы вызвать generateItemsets() для правил, а затем использовать дубликат() для поиска правил, которые содержат точно такие же элементы. - person Michael Hahsler; 07.08.2016

Удалите лишние правила с помощью пакета arules...

Запустить априорный алгоритм:

rules <- apriori(transDat, parameter = list(supp = 0.01, conf = 0.5, target = "rules", maxlen = 3))

Удалить лишнее:

rules <- rules[!is.redundant(rules)]

Осмотреть:

arules::inspect(rules)

Создайте фрейм данных:

df = data.frame(
lhs = labels(lhs(rules)),
rhs = labels(rhs(rules)), 
rules@quality)
person Sayuri Takeda    schedule 18.12.2017

Просто ознакомьтесь с справкой для is.redundant() в rstudio. В нем четко указано, что

Предположим, есть

rule1 X->Y с уверенностью cf1

правило2 X' -> Y с уверенностью cf2, где X' является подмножеством X

правило1 считается избыточным, если правило2 имеет более высокую достоверность, чем правило1, т. е. cf2 > cf1 (где X' является подмножеством X)

то есть, если существует правило, в котором подмножество левых может дать правое с большей уверенностью, то предшествующее правило называется избыточным правилом.

  1. Мы делаем нижний треугольник как na, чтобы правило не стало подмножеством самого себя

  2. Недостаточно информации, правила нельзя назвать избыточными только на основе подмножества, необходимо принимать во внимание значение достоверности

person rushikesh jachak    schedule 23.08.2018