Вопрос или проблема
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), чтобы определить, следует ли выполнять разбиение в данном узле.
В вашей ситуации:
-
Структура данных:
- У вас есть два уровня категориального признака
x1
(S1 и S2) и целевая переменнаяy
, представляющая две категории. Обратите внимание, что для узла с данным разбиением, данные разделяются наS1
(где все примеры имеют значениеy = 1
) иS2
(где один пример имеет значениеy = 0
, а другой –y = 1
).
- У вас есть два уровня категориального признака
-
Критерий Джини:
- Вы назначили значение
cp = 0
, что означает, что алгоритм не будет класть никаких ограничений на количество ошибок в узле. Однако, даже с этим значением,rpart
по-прежнему пытается минимизировать количество ошибок классификации в узле, и если разбиение не показывает улучшения, оно будет игнорироваться.
- Вы назначили значение
-
Улучшение в misclassification rate:
- Поскольку в узле
S2
есть один случай сy=0
и один сy=1
, после разбиения общая доля ошибок не уменьшится. Таким образом, несмотря на улучшение, выявленное метрикой Джини, реальный прирост точности (accuracy) разбиения не приводит к снижению кодовых ошибок против текущего состояния, что останавливает алгоритм.
- Поскольку в узле
-
Изменение параметра cp:
- Как вы отметили, при установке
cp = -1
, алгоритм начинает выполнять разбиения, так как теперь он игнорирует критерии стоимости. Это отражает тот факт, что страдая от жестких условий, алгоритм может найти силу в гибкости, открывая возможность для улучшения разбиений, которые изначально не были учтены.
- Как вы отметили, при установке
Заключение
Поэтому, несмотря на возможность наличия повышения в критерии Джини, rpart
принимает во внимание не только метрику Джини, но и уровень ошибок классификации в узле. Это приводит к тому, что при текущих настройках разбиение не производится. Установка более гибких параметров, таких как cp = -1
, позволяет обойти эти ограничения.
Рекомендации
- Проведите дополнительные эксперименты: Попробуйте менять параметры, чтобы найти баланс между сложностью модели и точностью.
- Изучите другие алгоритмы: Возможно, стоит рассмотреть альтернативные методы построения деревьев решений (например,
CART
,C4.5
илиXGBoost
), чтобы определить, какой из них лучше подойдет для ваших данных.
Эти шаги будут способствовать более глубокой проработке вашего анализа данных и улучшению ваших моделей.