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

Можно настроить деревья путем установки пар "имя-значение" в 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.

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

| | | | | | |

Похожие темы