Дерево решений, не классифицирующее переменную 3 категорий

#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 класса.