exponenta event banner

Разделение категориальных предикторов в деревьях классификации

Проблемы в разделении многоуровневых предикторов

Когда вы выращиваете дерево классификации, найти оптимальное двоичное разделение для категориального предиктора со многими уровнями сложнее с точки зрения вычислений, чем найти разделение для непрерывного предиктора. Для непрерывного предсказателя дерево может разделяться на полпути между любыми двумя соседними уникальными значениями предсказателя. Напротив, чтобы найти точное, оптимальное двоичное разбиение для категориального предиктора с уровнями L, дерево классификации должно учитывать 2L-1-1 разбиения. Для получения этой формулы:

  1. Подсчитайте количество способов назначения L различных значений левому и правому узлам. Есть 2L пути.

  2. Делите 2L на 2, так как можно поменять местами слева и справа.

  3. Отмените обращение с пустым узлом.

Для проблем регрессии и двоичной классификации программное обеспечение использует точный алгоритм поиска с помощью вычислительного ярлыка [1]. Дерево может упорядочивать категории по среднему отклику (для регрессии) или вероятности класса для одного из классов (для классификации). Затем оптимальным разделением является одно из разделений L-1 для упорядоченного списка. Поэтому вычислительные проблемы возникают только при выращивании деревьев классификации для данных с классами K ≥ 3.

Алгоритмы разделения категориального предиктора

Для уменьшения вычислений программное обеспечение предлагает несколько эвристических алгоритмов для нахождения хорошего разделения. Можно выбрать алгоритм разделения категориальных предикторов с помощью 'AlgorithmForCategorical' аргумент пары «имя-значение» при построении дерева классификации с помощью fitctree или при создании классификатора с помощью templateTree для классификационного ансамбля (fitcensembleили многоклассная модель ECOC (fitcecoc).

Если алгоритм не указан, программа выбирает оптимальный алгоритм для каждого разделения, используя известное количество классов и уровней категориального предиктора. Если предиктор имеет максимум MaxNumCategories уровни, программное обеспечение разбивает категориальные предикторы, используя точный алгоритм поиска. В противном случае программное обеспечение выбирает эвристический алгоритм поиска на основе количества классов и уровней. Дефолт MaxNumCategories уровень равен 10. В зависимости от вашей платформы программное обеспечение не может выполнять точный поиск по категориальным предикторам с более чем 32 или 64 уровнями.

Доступные эвристические алгоритмы: тянуть по чистоте, разбиение на основные компоненты и один против всех по классам.

Тянуть влево по чистоте

Алгоритм извлечения слева по чистоте начинается со всех L категориальных уровней на правой ветви. Затем алгоритм выполняет следующие действия:

  1. Проверьте категории K, которые имеют наибольшие вероятности классов для каждого класса.

  2. Переместите категорию с максимальным значением критерия разделения в левую ветвь.

  3. Продолжайте перемещение категорий справа налево, записывая критерий разделения при каждом перемещении, пока у правого нижестоящего элемента не останется только одна категория.

Из этой последовательности выбранное разделение является тем, которое максимизирует критерий разделения.

Выберите этот алгоритм, указав 'AlgorithmForCategorical','PullLeft' в fitctree или templateTree.

Секционирование на основе основных компонентов

Алгоритм [2] разбиения на основные компоненты находит близкое к оптимальному двоичное разбиение L уровней предиктора путем поиска разделяющей гиперплоскости. Гиперплоскость перпендикулярна первой главной составляющей взвешенной ковариационной матрицы центрированной вероятностной матрицы класса.

Алгоритм присваивает оценку каждой из L категорий, вычисленную как внутреннее произведение между найденным основным компонентом и вектором вероятностей классов для этой категории. Затем выбранное разбиение является одним из разбиений L-1, которое максимизирует критерий разбиения.

Выберите этот алгоритм, указав 'AlgorithmForCategorical','PCA' в fitctree или templateTree.

Один против всех по классам

Алгоритм «один против всех по классам» начинается со всех уровней категории 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')

Figure contains an axes. The axes contains an object of type bar.

Модель поезда

Для двоичной классификации программное обеспечение использует вычислительный ярлык, чтобы найти оптимальное разделение для категориальных предикторов со многими категориями. Для классификации с более чем двумя классами можно выбрать точный алгоритм или эвристический алгоритм, чтобы найти хорошее разделение с помощью '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] Брейман, Л., Дж. Х. Фридман, Р. А. Ольшен и К. Дж. Стоун. Деревья классификации и регрессии. Бока Ратон, Флорида: Чепмен энд Холл, 1984.

[2] Копперсмит, Д., С. Дж. Хон и Дж. Р. М. Хоскинг. «Разбиение номинальных атрибутов в деревьях решений». Data Mining and Knowledge Discovery, Vol. 3, 1999, pp. 197-217.

См. также

| | |

Связанные темы