Улучшение деревьев классификации и деревьев регрессии

Можно настроить деревья путем установки пар "имя-значение" в fitctree и fitrtree. Остаток от этого раздела описывает, как определить качество дерева, как решить, какие пары "имя-значение" установить, и как управлять размером дерева.

Исследование ошибки перезамены

Resubstitution error является различием между данными тренировки ответа и прогнозами, которые дерево делает из ответа на основе входных данных тренировки. Если ошибка перезамены будет высока, вы не можете ожидать, что прогнозы дерева будут хороши. Однако наличие низкой ошибки перезамены не гарантирует хорошие прогнозы для новых данных. Ошибка перезамены часто является чрезмерно оптимистической оценкой прогнозирующей ошибки на новых данных.

Ошибка перезамены дерева классификации

Этот пример показывает, как исследовать ошибку перезамены дерева классификации.

Загрузите ирисовые данные Фишера.

load fisheriris

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

Mdl = fitctree(meas,species);

Исследуйте ошибку перезамены.

resuberror = resubLoss(Mdl)
resuberror = 0.0200

Дерево классифицирует почти все ирисовые данные Фишера правильно.

Перекрестная проверка

Чтобы получить лучший смысл прогнозирующей точности вашего дерева для новых данных, крест подтверждает дерево. По умолчанию перекрестная проверка разделяет данные тренировки в 10 частей наугад. Это обучает 10 новых деревьев, каждого на девяти частях данных. Это затем исследует прогнозирующую точность каждого нового дерева на данных, не включенных в обучение то дерево. Этот метод дает хорошую оценку прогнозирующей точности получившегося дерева, поскольку это тестирует новые деревья на новых данных.

Крест подтверждает дерево регрессии

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

Загрузите набор данных carsmall. Рассмотрите ускорение, смещение, лошадиную силу и вес как предикторы MPG.

load carsmall
X = [Acceleration Displacement Horsepower Weight];

Вырастите дерево регрессии, использующее все наблюдения.

rtree = fitrtree(X,MPG);

Вычислите ошибку в выборке.

resuberror = resubLoss(rtree)
resuberror = 4.7188

Потеря перезамены для дерева регрессии является среднеквадратической ошибкой. Получившееся значение указывает, что типичная прогнозирующая ошибка для дерева о квадратном корне из 4,7, или более чем 2.

Оцените перекрестную проверку MSE.

rng 'default';
cvrtree = crossval(rtree);
cvloss = kfoldLoss(cvrtree)
cvloss = 25.6450

Перекрестная подтвержденная потеря - почти 25, означая, что типичная прогнозирующая ошибка для дерева на новых данных - приблизительно 5. Это демонстрирует, что перекрестная подтвержденная потеря обычно выше, чем простая потеря перезамены.

Выберите Split Predictor Selection Technique

Стандартный алгоритм CART имеет тенденцию выбирать непрерывные предикторы, которые имеют много уровней. Иногда, такой выбор может быть побочным и может также замаскировать более важные предикторы, которые имеют меньше уровней, таких как категориальные предикторы. Таким образом, процесс выбора предиктора в каждом узле смещается. Кроме того, стандартный CART имеет тенденцию пропускать важные взаимодействия между парами предикторов и ответа.

Чтобы смягчить обнаружение смещения и увеличения выбора важных взаимодействий, можно задать использование искривления или тестов взаимодействия с помощью аргумента пары "имя-значение" 'PredictorSelection'. Используя искривление или взаимодействие тест имеет добавленное преимущество создания лучших оценок важности предиктора, чем стандартный CART.

Эта таблица суммирует поддерживаемые методы выбора предиктора.

МетодЗначение 'PredictorSelection'ОписаниеУчебная скоростьКогда задать
Стандартный CART [1]Значение по умолчанию

Выбирает предиктор разделения, который максимизирует усиление критерия разделения по всем возможным разделениям всех предикторов.

Базовая линия для сравнения

Задайте, верно ли какое-либо из этих условий:

  • Все предикторы непрерывны

  • Важность предиктора не является аналитической целью

  • Для повышения деревьев решений

Тест искривления [2][3]'curvature'Выбирает предиктор разделения, который минимизирует p - значение тестов хи-квадрата независимости между каждым предиктором и ответом.Сопоставимый со стандартным CART

Задайте, верно ли какое-либо из этих условий:

  • Переменные прогноза неоднородны

  • Важность предиктора является аналитической целью

  • Улучшите древовидную интерпретацию

Тест взаимодействия [3]'interaction-curvature'Выбирает предиктор разделения, который минимизирует p - значение тестов хи-квадрата независимости между каждым предиктором и ответом (то есть, проводит тесты искривления), и это минимизирует p - значение теста хи-квадрата независимости между каждой парой предикторов и ответом.Медленнее, чем стандартный CART, особенно когда набор данных содержит много переменных прогноза.

Задайте, верно ли какое-либо из этих условий:

  • Переменные прогноза неоднородны

  • Вы подозреваете ассоциации между парами предикторов и ответа

  • Важность предиктора является аналитической целью

  • Улучшите древовидную интерпретацию

Для получения дополнительной информации на методах выбора предиктора:

Управляйте глубиной или “густой листвой”

Когда вы выращиваете дерево решений, рассматриваете его простоту и предсказательную силу. Глубокое дерево со многими листами обычно очень точно на данных тренировки. Однако дерево, как гарантируют, не покажет сопоставимую точность на независимом наборе тестов. Покрытое листвой дерево имеет тенденцию перетренироваться (или сверхподгонка), и ее тестовая точность часто является намного меньше, чем ее обучение (перезамена) точность. Напротив, мелкое дерево не достигает высокой учебной точности. Но мелкое дерево может быть более устойчивым — его учебная точность могла быть близко к тому из представительного набора тестов. Кроме того, мелкое дерево легко интерпретировать. Если у вас нет достаточного количества данных для обучения и теста, оцените древовидную точность перекрестной проверкой.

fitctree и fitrtree имеют три аргумента пары "имя-значение", которые управляют глубиной получившихся деревьев решений:

  • MaxNumSplits — Максимальным количеством разделений узла ответвления является MaxNumSplits на дерево. Установите большое значение для MaxNumSplits, чтобы получить глубокое дерево. Значением по умолчанию является size(X,1) – 1.

  • MinLeafSize — Каждый лист имеет, по крайней мере, наблюдения MinLeafSize. Установите маленькие значения MinLeafSize, чтобы получить глубокие деревья. Значением по умолчанию является 1.

  • MinParentSize — Каждый узел ответвления в дереве имеет, по крайней мере, наблюдения MinParentSize. Установите маленькие значения MinParentSize, чтобы получить глубокие деревья. Значением по умолчанию является 10.

Если вы задаете MinParentSize и MinLeafSize, ученик использует установку, которая приводит к деревьям с большими листами (т.е. более мелкими деревьями):

MinParent = max(MinParentSize,2*MinLeafSize)

Если вы предоставляете MaxNumSplits, программное обеспечение разделяет дерево, пока один из трех разделяющих критериев не удовлетворен.

Для альтернативного метода управления древовидной глубиной смотрите Сокращение.

Выберите Appropriate Tree Depth

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

Загрузите данные ionosphere.

load ionosphere

Сгенерируйте экспоненциально расположенное с интервалами множество значений от 10 до 100, которые представляют минимальное количество наблюдений на вершину.

leafs = logspace(1,2,10);

Создайте перекрестные подтвержденные деревья классификации для данных ionosphere. Задайте, чтобы вырастить каждое дерево с помощью минимального листового размера в leafs.

rng('default')
N = numel(leafs);
err = zeros(N,1);
for n=1:N
    t = fitctree(X,Y,'CrossVal','On',...
        'MinLeafSize',leafs(n));
    err(n) = kfoldLoss(t);
end
plot(leafs,err);
xlabel('Min Leaf Size');
ylabel('cross-validated error');

Лучший листовой размер приблизительно между 20 и наблюдениями 50 на лист.

Сравните почти оптимальное дерево, по крайней мере, с наблюдениями 40 на лист с деревом по умолчанию, которое использует наблюдения 10 на родительский узел и наблюдение 1 на лист.

DefaultTree = fitctree(X,Y);
view(DefaultTree,'Mode','Graph')

OptimalTree = fitctree(X,Y,'MinLeafSize',40);
view(OptimalTree,'mode','graph')

resubOpt = resubLoss(OptimalTree);
lossOpt = kfoldLoss(crossval(OptimalTree));
resubDefault = resubLoss(DefaultTree);
lossDefault = kfoldLoss(crossval(DefaultTree));
resubOpt,resubDefault,lossOpt,lossDefault
resubOpt = 0.0883
resubDefault = 0.0114
lossOpt = 0.1054
lossDefault = 0.1111

Почти оптимальное дерево намного меньше и дает намного более высокую ошибку перезамены. Все же это дает подобную точность для перекрестных подтвержденных данных.

Сокращение

Сокращение оптимизирует древовидную глубину (густая листва) путем слияния листов на том же древовидном ответвлении. Управляйте Глубиной, или “Густая листва” описывает один метод для выбора оптимальной глубины для дерева. В отличие от этого, в том разделе, вы не должны выращивать новое дерево для каждого размера узла. Вместо этого вырастите глубокое дерево и сократите его к уровню, который вы выбираете.

Сократите дерево в командной строке с помощью метода prune (классификация) или метод prune (регрессия). Также сократите дерево в интерактивном режиме с древовидным средством просмотра:

view(tree,'mode','graph')

Чтобы сократить дерево, дерево должно содержать последовательность сокращения. По умолчанию и fitctree и fitrtree вычисляют последовательность сокращения для дерева во время конструкции. Если вы создаете дерево с набором пары "имя-значение" 'Prune' к 'off', или если вы сокращаете дерево к меньшему уровню, дерево не содержит полную последовательность сокращения. Сгенерируйте полную последовательность сокращения с методом prune (классификация) или метод prune (регрессия).

Сократите дерево классификации

Этот пример создает дерево классификации для данных ionosphere и сокращает их к хорошему уровню.

Загрузите данные ionosphere:

load ionosphere

Создайте дерево классификации по умолчанию для данных:

tree = fitctree(X,Y);

Просмотрите дерево в интерактивном средстве просмотра:

view(tree,'Mode','Graph')

Найдите оптимальный уровень сокращения путем минимизации перекрестной подтвержденной потери:

[~,~,~,bestlevel] = cvLoss(tree,...
    'SubTrees','All','TreeSize','min')
bestlevel = 6

Сократите дерево, чтобы выровнять 6:

view(tree,'Mode','Graph','Prune',6)

Также используйте интерактивное окно, чтобы сократить дерево.

Сокращенное дерево совпадает с почти оптимальным деревом в "Избранной Соответствующей Древовидной Глубине" пример.

Установите 'TreeSize' на 'SE' (значение по умолчанию) находить максимальный уровень сокращения, для которого древовидная ошибка не превышает ошибку от лучшего уровня плюс одно стандартное отклонение:

[~,~,~,bestlevel] = cvLoss(tree,'SubTrees','All')
bestlevel = 6

В этом случае уровень является тем же самым для любой установки 'TreeSize'.

Сократите дерево, чтобы использовать его для других целей:

tree = prune(tree,'Level',6); 
view(tree,'Mode','Graph')

Ссылки

[1] Бреимен, L., Дж. Х. Фридман, Р. А. Олшен и К. Дж. Стоун. Классификация и деревья регрессии. Бока-Ратон, FL: Chapman & Hall, 1984.

[2] Loh, В.И. и И.С. Ши. “Разделите Методы выбора для Деревьев Классификации”. Statistica Sinica, Издание 7, 1997, стр 815–840.

[3] Loh, W.Y. “Деревья регрессии с Несмещенным Обнаружением Выбора переменной и Взаимодействия”. Statistica Sinica, Издание 12, 2002, стр 361–386.

Смотрите также

| | | | | | |

Похожие темы