Когда вы выращиваете дерево классификации, находя, что оптимальное бинарное разделение для категориального предиктора со многими уровнями более в вычислительном отношении сложно, чем нахождение разделения для непрерывного предиктора. Для непрерывного предиктора дерево может разделить на полпути между любыми двумя смежными, уникальными значениями предиктора. Напротив, чтобы найти точное, оптимальное бинарное разделение для категориального предиктора с уровнями L, дерево классификации должно рассмотреть разделения 2L–1–1. Получить эту формулу:
Считайте количество способов присвоить L отличные значения левым и правым узлам. Существуют 2L пути.
Разделитесь 2L на 2, потому что левый и правый может быть подкачан.
Отбросьте случай, который имеет пустой узел.
Для проблем регрессии и бинарных проблем классификации, программное обеспечение использует точный алгоритм поиска через вычислительный ярлык [1]. Дерево может заказать категории средним ответом (для регрессии) или вероятность класса для одного из классов (для классификации). Затем оптимальное разделение является одним из L – 1 разделение для упорядоченного списка. Поэтому вычислительные проблемы возникают только, когда вы выращиваете деревья классификации для данных с K ≥ 3 класса.
Чтобы уменьшать вычисление, программное обеспечение предлагает несколько эвристических алгоритмов для нахождения хорошего разделения. Можно выбрать алгоритм для разделения категориальных предикторов при помощи аргумента пары "имя-значение" 'AlgorithmForCategorical'
, когда вы выращиваете дерево классификации использование fitctree
или когда вы создаете ученика классификации, использующего templateTree
для ансамбля классификации (fitcensemble
) или мультикласс модель ECOC (fitcecoc
).
Если вы не задаете алгоритм, программное обеспечение выбирает оптимальный алгоритм для каждого разделения с помощью известного количества классов и уровней категориального предиктора. Если предиктор имеет на большинстве уровней MaxNumCategories
, программное обеспечение разделяет категориальные предикторы с помощью точного алгоритма поиска. В противном случае программное обеспечение выбирает эвристический алгоритм поиска на основе количества классов и уровней. Уровень MaxNumCategories
по умолчанию равняется 10. В зависимости от вашей платформы программное обеспечение не может выполнить точный поиск на категориальных предикторах больше чем с 32 или 64 уровнями.
Доступные эвристические алгоритмы: вытяните оставленный чистотой, основным компонентно-ориентированным разделением и one-all классом.
Получение по запросу, оставленное алгоритмом чистоты, запускает со всего L категориальные уровни на правильном ответвлении. Алгоритм затем принимает эти меры:
Осмотрите категории K, которые имеют самые большие вероятности класса для каждого класса.
Переместите категорию с максимальным значением критерия разделения к левому ответвлению.
Продолжите движущиеся категории справа налево, записав критерий разделения при каждом перемещении, пока у правильного дочернего элемента не будет только одной остающейся категории.
Из этой последовательности выбранное разделение является тем, которое максимизирует критерий разделения.
Выберите этот алгоритм путем определения 'AlgorithmForCategorical','PullLeft'
в fitctree
или templateTree
.
Основной компонентно-ориентированный алгоритм разделения [2] находит близко-к-оптимальному бинарный раздел уровней предиктора L путем поиска отделяющейся гиперплоскости. Гиперплоскость перпендикулярна первому основному компоненту взвешенной ковариационной матрицы матрицы вероятности класса в центре.
Алгоритм присваивает счет каждой из категорий L, вычисленных как скалярное произведение между найденным основным компонентом и вектором вероятностей класса для той категории. Затем выбранное разделение является одним из L – 1 разделение, который максимизирует критерий разделения.
Выберите этот алгоритм путем определения 'AlgorithmForCategorical','PCA'
в fitctree
или templateTree
.
One-all алгоритмом класса запускает со всего L категориальные уровни на правильном ответвлении. Для каждого из классов K алгоритм заказывает категории на основе их вероятности для того класса.
Для первого класса алгоритм перемещает каждую категорию в левое ответвление по порядку, записывая критерий разделения при каждом перемещении. Затем алгоритм повторяет этот процесс для остающихся классов. Из этой последовательности выбранное разделение является тем, которое максимизирует критерий разделения.
Выберите этот алгоритм путем определения 'AlgorithmForCategorical','OVAbyClass'
в fitctree
или templateTree
.
Этот пример показывает, как осмотреть набор данных, который включает категориальные предикторы со многими уровнями (категории) и как обучить дерево выбора из двух альтернатив классификации.
Загрузка демонстрационных данных
Загрузите файл census1994
. Этот набор данных состоит из демографических данных Бюро переписи США, чтобы предсказать, передает ли человек 50 000$ в год. Задайте массив ячеек из символьных векторов, содержащий имена переменных.
load census1994
VarNames = adultdata.Properties.VariableNames;
Некоторые имена переменных в таблице adultdata
содержат символ _
. Замените экземпляры _
с пробелом.
VarNames = strrep(VarNames,'_',' ');
Задайте данные о предикторе tbl
и вектор отклика Y
.
tbl = adultdata(:,1:end-1); Y = categorical(adultdata.salary);
Осмотрите категориальные предикторы
Некоторые категориальные переменные имеют много уровней (категории). Считайте количество уровней каждого категориального предиктора.
Найдите индексы категориальных предикторов, которые не являются числовыми в таблице tbl
при помощи varfun
и isnumeric
. Функция varfun
применяет функцию isnumeric
к каждой переменной таблицы tbl
.
cat = ~varfun(@isnumeric,tbl,'OutputFormat','uniform');
Задайте анонимную функцию, чтобы считать количество категорий в категориальном предикторе с помощью numel
и categories
.
countNumCats = @(var)numel(categories(categorical(var)));
Анонимная функция countNumCats
преобразовывает предиктор в категориальный массив, затем считает уникальные, непустые категории предиктора.
Используйте varfun
и countNumCats
, чтобы считать количество категорий для категориальных предикторов в tbl
.
numCat = varfun(@(var)countNumCats(var),tbl(:,cat),'OutputFormat','uniform');
Постройте количество категорий для каждого категориального предиктора.
figure barh(numCat); h = gca; h.YTickLabel = VarNames(cat); ylabel('Predictor') xlabel('Number of categories')
Модель train
Для бинарной классификации программное обеспечение использует вычислительный ярлык, чтобы найти оптимальное разделение для категориальных предикторов со многими категориями. Для классификации больше чем с двумя классами можно выбрать точный алгоритм или эвристический алгоритм, чтобы найти хорошее разделение при помощи 'аргумента пары "имя-значение" AlgorithmForCategorical'
fitctree
или templateTree
. По умолчанию программное обеспечение выбирает оптимальное подмножество алгоритмов для каждого разделения с помощью известного количества классов и уровней категориального предиктора.
Обучите дерево классификации использование tbl
и Y
. Y
вектора отклика имеет два класса, таким образом, программное обеспечение использует точный алгоритм для категориальных разделений предиктора.
Mdl = fitctree(tbl,Y)
Mdl = ClassificationTree PredictorNames: {1x14 cell} ResponseName: 'Y' CategoricalPredictors: [2 4 6 7 8 9 10 14] ClassNames: [<=50K >50K] ScoreTransform: 'none' NumObservations: 32561 Properties, Methods
[1] Бреимен, L., Дж. Х. Фридман, Р. А. Олшен и К. Дж. Стоун. Классификация и деревья регрессии. Бока-Ратон, FL: Chapman & Hall, 1984.
[2] Котельщик, Д., С. Цз. Хун и Дж. Р. М. Хоскинг. “Деля Номинальные Атрибуты в Деревьях решений”. Анализ данных и Открытие Знаний, Издание 3, 1999, стр 197–217.
fitcensemble
| fitctree
| fitrtree
| templateTree