#r
#r
Вопрос:
Я пытаюсь построить дерево решений с категориальной переменной (3 категории) с 194 предикторами.
Данные взяты из электронной коммерции, и цель состоит в том, чтобы узнать, есть ли у клиента только девочки, только мальчики или дети обоих полов на основе продуктов, которые они купили. Проблема в том, что дерево решений возвращает только 2 классификации (мальчики и девочки, и ни одно условие не классифицируется как оба пола).
Это мой R-код:
fit <- rpart(GENDER~X1 X2 X3 X4 ... X193 X194,method="class", data=data)
Это мои результаты:
n= 4179
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 4179 2184 girl (0.12921752 0.47738693 0.39339555)
2) X120>=0.5 1042 229 girl(0.16890595 0.78023033 0.05086372) *
3) X120< 0.5 3137 1546 boy(0.11603443 0.37679311 0.50717246)
6) X109>=0.5 381 120 girl(0.19160105 0.68503937 0.12335958) *
7) X109< 0.5 2756 1212 boy(0.10558781 0.33417997 0.56023222)
14) X194>=0.5 129 34 girl(0.20155039 0.73643411 0.06201550) *
15) X194< 0.5 2627 1091 boy(0.10087552 0.31442710 0.58469737)
30) X119< 0.5 2382 1057 boy(0.10327456 0.34047019 0.55625525)
60) X122>=0.5 70 12 girl (0.12857143 0.82857143 0.04285714) *
61) X122< 0.5 2312 990 boy(0.10250865 0.32569204 0.57179931) *
31) X119>=0.5 245 34 boy(0.07755102 0.06122449 0.86122449) *
Classification tree:
rpart(formula = GENDER ~ ., data = crs$dataset[crs$train, c(crs$input,
crs$target)], method = "class", parms = list(split = "information"),
control = rpart.control(usesurrogate = 0, maxsurrogate = 0))
Как я могу классифицировать в 3 категориях вместо просто 2?
Комментарии:
1. Сколько вхождений «обоих» у вас есть в обучающих данных? Возможно, их настолько мало, что они не оказывают большого влияния на показатель ошибки древовидного классификатора. Используйте
randomForest
, чтобы вырастить больше деревьев и объединить их.2. Или их так мало, что они никогда не являются выбором множества ни на одном листе.
3. @ilir общий набор данных составляет 5971 строку, девочки = 2844, мальчики = 2359, оба = 768
4. @Spacedman Прошу прощения, мои данные на португальском, так что на самом деле «Девушка» — это «Менина» в исходном наборе данных. Я только что перевел это на английский в вопросе, чтобы другие поняли и помогли мне без глупых вопросов, подобных вашим.
Ответ №1:
По умолчанию rpart()
имеет некоторые правила остановки, которые не позволяют ему соответствовать полному дереву (т. Е. Одному наблюдению в каждом узле), потому что это редко то, что вы хотите, и вы просто в конечном итоге обрезаете эти густые, избыточные листья обратно.
Следовательно, я бы предположил, что ваше дерево не способно предсказывать класс Both
поскольку, что касается построенного дерева, оно никогда не было победителем большинства голосов ни в одном из конечных узлов. Три значения в круглых скобках после girl
или boy
являются апостериорными вероятностями каждого класса. boy
— это 2-е значение, girl
третье значение и both
первое значение (учитывая, что это был бы способ по умолчанию, которым R назначает порядок уровней). Таким образом, rpart()
принимается во внимание тот факт, что существует три класса, просто указанное разделение никогда не предсказывало этот класс both
.
Вы могли бы заставить rpart
построить большое / полное дерево; посмотрите на ?rpart.control
и аргументы minsplit
, minbucket
и cp
которые все действуют, чтобы остановить рост дерева слишком большим, но настроены для несколько больших проблем. Вы можете настроить их так, чтобы они соответствовали полному дереву (установите их все на низком уровне), но имейте в виду, что в конечном итоге вам, вероятно, придется обрезать большую часть этих внешних листьев.
Что касается того, почему randomForest возвращает третью категорию; возможно, есть образцы начальной загрузки, где вы можете предсказать класс both()
, или есть переменные, важные для прогнозирования, both
которые выделены, потому что randomForest извлекает mtry
переменные случайным образом для проверки при выборе каждого разделения.
Ответ №2:
Я только что запустил случайный лес с тем же набором данных, и появилась третья категория.
Комментарии:
1. Третья категория присутствовала в
rpart()
выводе, который вы показываете, просто ни у одного из узлов не было более высокой апостериорной вероятности (или большинства голосов) дляboth
класса.