Проблема классификации RWeka J48 в наборах данных R и MovieLense

Я хочу классифицировать демографические данные таблицы пользователей Movielense, но результат J48 странный, я классифицирую свои данные с C5.0, и все было хорошо, но я должен работать над этим алгоритмом (j48)

Структура моих данных, как показано ниже

$ user_id   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ age       : Factor w/ 7 levels "1","18","25",..: 1 7 3 5 3 6 4 3 3 4 ...
 $ occupation: Factor w/ 21 levels "0","1","2","3",..: 11 17 16 8 21 10 2 13 18 2 ...
 $ gender    : Factor w/ 2 levels "F","M": 1 2 2 2 2 1 2 2 2 1 ...
 $ Class     : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 3 2 2 2 2 4 ...

и глава данных

head(data)
  user_id age occupation gender Class
1       1   1         10      F     2
2       2  56         16      M     2
3       3  25         15      M     2
4       4  45          7      M     2
5       5  25         20      M     3
6       6  50          9      F     2

все столбцы кроме user_id являются nominal type и должно быть factor in R

Код для классификации:

library(RWeka)
fit <- J48(data$Class~., data=data[,-c(1)], control = Weka_control(C=0.25))
currentUserClass = predict(fit,data[,-c(1)])
table(currentUserClass , data$Class)

и неверная таблица итогового результата

currentUserClass    1    2    3    4
               1    0    0    0    0
               2  216 3630 1549  645
               3    0    0    0    0
               4    0    0    0    0

Когда я подгоняю свою модель к C5.0, результат будет примерно таким, как показано ниже

predictions    1    2    3    4
          1  216    0    0    0
          2    0 3630    0    0
          3    0    0 1549    0
          4    0    0    0  645

Больше попробовать

  1. Я изменяю структуру своих данных и преобразовываю столбцы фактора в отдельные столбцы, и ничего не меняется
  2. я меняю C controller value результат идет немного лучше в C=0.75 но это совершенно неправильно

событие после нормализации и изменения данных ничего не произошло

> head(data)
  user_id       age1      age18      age25      age35      age45      age50
1       1  5.1188737 -0.4726289 -0.7289391 -0.4960755 -0.3164894 -0.2990841
2       2 -0.1953231 -0.4726289 -0.7289391 -0.4960755 -0.3164894 -0.2990841
3       3 -0.1953231 -0.4726289  1.3716296 -0.4960755 -0.3164894 -0.2990841
4       4 -0.1953231 -0.4726289 -0.7289391 -0.4960755  3.1591400 -0.2990841
5       5 -0.1953231 -0.4726289  1.3716296 -0.4960755 -0.3164894 -0.2990841
6       6 -0.1953231 -0.4726289 -0.7289391 -0.4960755 -0.3164894  3.3429880
       age56 occupation1 occupation2 occupation3 occupation4 occupation5
1 -0.2590882  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
2  3.8590505  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
3 -0.2590882  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
4 -0.2590882  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
5 -0.2590882  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
6 -0.2590882  -0.3094756  -0.2150398  -0.1717035  -0.3790765  -0.1374418
  occupation6 occupation7 occupation8 occupation9 occupation10 occupation11
1  -0.2016306  -0.3558574 -0.05312294  -0.1243576    5.4744311   -0.1477163
2  -0.2016306  -0.3558574 -0.05312294  -0.1243576   -0.1826371   -0.1477163
3  -0.2016306  -0.3558574 -0.05312294  -0.1243576   -0.1826371   -0.1477163
4  -0.2016306   2.8096490 -0.05312294  -0.1243576   -0.1826371   -0.1477163
5  -0.2016306  -0.3558574 -0.05312294  -0.1243576   -0.1826371   -0.1477163
6  -0.2016306  -0.3558574 -0.05312294   8.0399919   -0.1826371   -0.1477163
  occupation12 occupation13 occupation14 occupation15 occupation16 occupation17
1   -0.2619865   -0.1551514   -0.2293967   -0.1562667   -0.2038431   -0.3010506
2   -0.2619865   -0.1551514   -0.2293967   -0.1562667    4.9049217   -0.3010506
3   -0.2619865   -0.1551514   -0.2293967    6.3982549   -0.2038431   -0.3010506
4   -0.2619865   -0.1551514   -0.2293967   -0.1562667   -0.2038431   -0.3010506
5   -0.2619865   -0.1551514   -0.2293967   -0.1562667   -0.2038431   -0.3010506
6   -0.2619865   -0.1551514   -0.2293967   -0.1562667   -0.2038431   -0.3010506
  occupation18 occupation19 occupation20    genderM Class
1   -0.1082744   -0.1098287   -0.2208735 -1.5917949     2
2   -0.1082744   -0.1098287   -0.2208735  0.6281176     2
3   -0.1082744   -0.1098287   -0.2208735  0.6281176     2
4   -0.1082744   -0.1098287   -0.2208735  0.6281176     2
5   -0.1082744   -0.1098287    4.5267283  0.6281176     3
6   -0.1082744   -0.1098287   -0.2208735 -1.5917949     2
> fit <- J48(data$Class~., data=data, control = Weka_control(C=0.25))
> currentUserClass = predict(fit,data)
> table(currentUserClass , data$Class)

currentUserClass    1    2    3    4
               1    7    1    2    2
               2  201 3601 1470  617
               3    8   28   75   14
               4    0    0    2   12

1 ответ

J48 реализует алгоритм дерева решений C4.5. Производительность C5.0 и C4.5 может отличаться. Тем не менее, параметры J48 в Weka могут быть изменены (как вы показали в коде выше). Возможно, это поможет удовлетворить ваши потребности.

Для начала, ваше дерево, вероятно, является классом предсказания с одним листом. Это можно проверить, распечатав дерево решений. Код ниже делает это с набором данных "mtcars" (встроенный набор данных с R).

dat <- mtcars 
dat$carb <- factor(dat$carb)
model1 <- J48(carb ~., data = dat)
model1

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

model2 <- J48(carb ~., data = dat, control= Weka_control(M=1,U=TRUE))
model2

Следующее можно использовать для проверки допустимых параметров J48:

WOW(J48)

Вы должны изменить параметры по умолчанию J48, чтобы соответствовать вашим конкретным потребностям. Я рекомендую сравнить параметры, используемые в вашем C5.0, с параметрами по умолчанию J48 и, при необходимости, внести изменения.

Другие вопросы по тегам