Процедура алгоритма OneR в R
Я использовал алгоритм OneR пакета FSelecter, чтобы найти атрибут с наименьшей частотой появления ошибок. Мой класс Атрибут - это да и нет. Мои характеристики атрибутов тоже да и нет.
Результат алгоритма OneR:
Ranking-No. 1
Atribut-Name: OR1:
Matrix: ------ 0(Attribut-Characteristic) -- 1 (Attribut Characteristics
0(Class):-------------------25243-------------------0
1(Class: -------------------1459-------------------18
Error-Rate: 1459 (0 + 1459)
Ranking-No. 2
Atribut-Name: OR2:
Matrix: ------ 0(Attribut-Characteristic) -- 1 (Attribut Characteristics
0(Class):-------------------25243-------------------0
1(Class: -------------------1460-------------------17
Error-Rate: 1460 (0 + 1460)
Однако, если я использую функцию корреляции в одном и том же фрейме данных, лучшие атрибуты имеют более низкий уровень ошибок, чем атрибуты, которые я получаю с помощью функции oneR.
Atribut-Name: CO4:
Matrix: ------ 0(Attribut-Characteristic) -- 1 (Attribut Characteristics
0(Class):-------------------25204-------------------39
1(Class: -------------------1348-------------------129
Error-Rate: 1387 (39 + 1348)
Кто-нибудь может сказать мне, почему алгоритм OneR не показывает Аттрибут CO4 как лучший Атрибут (основанный на частоте ошибок)?
Какие критерии использует алгоритм OneR?
--- Дополнение, чтобы лучше понять мой вопрос ---
Полные данные слишком велики, чтобы показать это. Я построил новый пул данных, который имеет тот же эффект
ЗАДЕРЖАНО - OR1 - CO4..
1 --------- 1 -------- 1--
0 --------- 0 -------- 0--
0 --------- 0 -------- 1--
1 --------- 0 -------- 1--
0 --------- 0 -------- 0--
1 --------- 0 -------- 1--
0 --------- 0 -------- 0--
1 --------- 0 -------- 1--
Код для отображения частоты ошибок для одного атрибута:
печать (таблица (datapool_stackru$DELAYED, datapool_stackru$OR1))
Код функции OneR:
библиотека (FSelector)
oneR_stackru <- oneR (DELAYED ~., datapool_stackru)
subset_stackru <- cutoff.k (oneR_stackru, 2)
печать (subset_stackru)
Код для корреляции:
cor (as.numeric (datapool_stackru $DELAYED), as.numeric(datapool_stackru $ OR1))
В этом случае результаты:
Коэффициент ошибок: Матрица OR1: ------ 0(Атрибут-признак) - 1 (Атрибут-признак
0 (класс): --------------------- 4 ----------------------- --0
1 (Класс: ---------------------3-------------------------1
Мануэль рассчитал коэффициент ошибок: 3(0 + 3)
Коэффициент ошибок: матрица CO4: ------ 0(Атрибут-характеристика) - 1 (Атрибут-характеристика
0 (класс): ----------------------- 3 --------------------- --1
1 (Класс: -----------------------0-----------------------4
Коэффициент ошибок: 1(1 + 0)
Соотношение: Attribut OR1: 0,377 Attribut CO4: 0,77
OneR: "OR1", "CO4"
Почему функция OneR предоставляет атрибут OR1 как лучший атрибут для классификации?
3 ответа
Хорошо, у меня есть решение. Алгоритм вычисляет сумму частоты ошибок характеристик в атрибуте (по отношению к максимальному значению характеристики)
В этом примере:
Атрибут OR1: 3/7 + 0/1 = 3/7
Аттрибут CO4: 0/3 + 1/5 = 0,2
Вы не указали типы своих данных, но я предполагаю, что у вас есть числовые значения. FSelector дискретизирует эти значения перед их использованием в oneR
и кажется, что там происходят плохие вещи (что может быть ошибкой в RWeka Discretize
функция). Тем не менее, вам, вероятно, все равно нужны факторные переменные, а не числовые данные, поскольку у вас есть только 0-1 значения. Тогда у меня все отлично работает
> df = data.frame(delayed=factor(c(1,0,0,1,0,1,0,1)), or1 = factor(c(1,0,0,0,0,0,0,0)), co4 = factor(c(1,0,1,1,0,1,0,1)))
> library(FSelector)
> oneR(delayed~., df)
attr_importance
or1 0.2000000
co4 0.4285714
Как вы можете видеть, co4 теперь имеет гораздо большее значение, чем or1, как и должно быть.
Нет, CO4
должен быть выбран, выбор другого атрибута неправильный - посмотрите, что дает пакет OneR (доступный в CRAN):
> library(OneR)
> DELAYED <- c(1, 0, 0, 1, 0, 1, 0, 1)
> OR1 <- c(1, rep(0, 7))
> CO4 <- c(1, 0, 1, 1, 0, 1, 0, 1)
>
> data <- data.frame(DELAYED, OR1, CO4)
>
> model <- OneR(formula = DELAYED ~., data = data, verbose = T)
Attribute Accuracy
1 * CO4 87.5%
2 OR1 62.5%
---
Chosen attribute due to accuracy
and ties method (if applicable): '*'
> summary(model)
Rules:
If CO4 = 0 then DELAYED = 0
If CO4 = 1 then DELAYED = 1
Accuracy:
7 of 8 instances classified correctly (87.5%)
Contingency table:
CO4
DELAYED 0 1 Sum
0 * 3 1 4
1 0 * 4 4
Sum 3 5 8
---
Maximum in each column: '*'
Pearson's Chi-squared test:
X-squared = 2.1333, df = 1, p-value = 0.1441
>
> model_2 <- OneR(formula = DELAYED ~ OR1, data = data)
> summary(model_2)
Rules:
If OR1 = 0 then DELAYED = 0
If OR1 = 1 then DELAYED = 1
Accuracy:
5 of 8 instances classified correctly (62.5%)
Contingency table:
OR1
DELAYED 0 1 Sum
0 * 4 0 4
1 3 * 1 4
Sum 7 1 8
---
Maximum in each column: '*'
Pearson's Chi-squared test:
X-squared = 0, df = 1, p-value = 1
Вы можете найти больше информации о пакете OneR здесь: https://github.com/vonjd/OneR
(полное раскрытие: я являюсь автором этого пакета)