Проблема классификации 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
Больше попробовать
- Я изменяю структуру своих данных и преобразовываю столбцы фактора в отдельные столбцы, и ничего не меняется
- я меняю
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 и, при необходимости, внести изменения.