Почему rpart не делит эти данные, даже когда есть прирост в Джини?

Вопрос или проблема

df <- tibble(x1=factor(c("S1", "S1", "S2", "S2")), y=factor(c(1, 1, 0, 1)))
md <- rpart(formula=y~., data=df, method="class", control=rpart.control(minsplit=2, cp=0))
nrow(md$frame) #выводит 1

Рассмотрим разделение

левая дочерняя нода:

"S1", 1

"S1", 1

Правая дочерняя нода:

"S2", 0

"S2", 1

Здесь прирост в джини составит ${1 \over 8} = 0.125$

Почему rpart не делает это разделение?

Похоже, что rpart на самом деле использует точность, а не джини при обрезке по сложности затрат, см. например https://stats.stackexchange.com/a/223211/232706

Поскольку ваше разделение не улучшает уровень неправильной классификации, rpart не выполняет его даже при cp=0. Установив cp=-1, разделение выполняется.

Ответ или решение

В данном случае вопрос касается работы алгоритма дерева решений rpart в R и его неспособности произвести разбиение, даже тогда, когда имеется выигрыш в критерии Джини. Мы подробно рассмотрим, почему rpart может не выполнять это разбиение, несмотря на наличие потенциального прироста метрики.

Основное объяснение

Алгоритм rpart принимает во внимание несколько факторов при принятии решения о разбиении узла. Хотя критерий Джини может указывать на положительное изменение при разбиении, алгоритм также анализирует общий уровень ошибок классификации (misclassification rate) и стоимость комплексного сглаживания (cost complexity pruning), чтобы определить, следует ли выполнять разбиение в данном узле.

В вашей ситуации:

  1. Структура данных:

    • У вас есть два уровня категориального признака x1 (S1 и S2) и целевая переменная y, представляющая две категории. Обратите внимание, что для узла с данным разбиением, данные разделяются на S1 (где все примеры имеют значение y = 1) и S2 (где один пример имеет значение y = 0, а другой – y = 1).
  2. Критерий Джини:

    • Вы назначили значение cp = 0, что означает, что алгоритм не будет класть никаких ограничений на количество ошибок в узле. Однако, даже с этим значением, rpart по-прежнему пытается минимизировать количество ошибок классификации в узле, и если разбиение не показывает улучшения, оно будет игнорироваться.
  3. Улучшение в misclassification rate:

    • Поскольку в узле S2 есть один случай с y=0 и один с y=1, после разбиения общая доля ошибок не уменьшится. Таким образом, несмотря на улучшение, выявленное метрикой Джини, реальный прирост точности (accuracy) разбиения не приводит к снижению кодовых ошибок против текущего состояния, что останавливает алгоритм.
  4. Изменение параметра cp:

    • Как вы отметили, при установке cp = -1, алгоритм начинает выполнять разбиения, так как теперь он игнорирует критерии стоимости. Это отражает тот факт, что страдая от жестких условий, алгоритм может найти силу в гибкости, открывая возможность для улучшения разбиений, которые изначально не были учтены.

Заключение

Поэтому, несмотря на возможность наличия повышения в критерии Джини, rpart принимает во внимание не только метрику Джини, но и уровень ошибок классификации в узле. Это приводит к тому, что при текущих настройках разбиение не производится. Установка более гибких параметров, таких как cp = -1, позволяет обойти эти ограничения.

Рекомендации

  • Проведите дополнительные эксперименты: Попробуйте менять параметры, чтобы найти баланс между сложностью модели и точностью.
  • Изучите другие алгоритмы: Возможно, стоит рассмотреть альтернативные методы построения деревьев решений (например, CART, C4.5 или XGBoost), чтобы определить, какой из них лучше подойдет для ваших данных.

Эти шаги будут способствовать более глубокой проработке вашего анализа данных и улучшению ваших моделей.

Оцените материал
Добавить комментарий

Капча загружается...