Можно настроить деревья путем установки пар "имя-значение" в 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 = 23.5706
Перекрестная подтвержденная потеря - почти 25, означая, что типичная прогнозирующая ошибка для дерева на новых данных - приблизительно 5. Это демонстрирует, что перекрестная подтвержденная потеря обычно выше, чем простая потеря перезамены.
Стандартный алгоритм CART имеет тенденцию выбирать непрерывные предикторы, которые имеют много уровней. Иногда, такой выбор может быть побочным и может также замаскировать более важные предикторы, которые имеют меньше уровней, таких как категориальные предикторы. Таким образом, процесс выбора предиктора в каждом узле смещается. Кроме того, стандартный CART имеет тенденцию пропускать важные взаимодействия между парами предикторов и ответа.
Чтобы смягчить обнаружение смещения и увеличения выбора важных взаимодействий, можно задать использование искривления или тестов взаимодействия с помощью 'PredictorSelection'
аргумент пары "имя-значение". Используя искривление или взаимодействие тест имеет добавленное преимущество создания лучших оценок важности предиктора, чем стандартный CART.
Эта таблица суммирует поддерживаемые методы выбора предиктора.
Метод | 'PredictorSelection' Значение | Описание | Учебная скорость | Когда задать |
---|---|---|---|---|
Стандартный CART [1] | Значение по умолчанию |
Выбирает предиктор разделения, который максимизирует усиление критерия разделения по всем возможным разделениям всех предикторов. | Базовая линия для сравнения |
Задайте, верно ли какое-либо из этих условий:
|
Тест искривления [2][3] | 'curvature' | Выбирает предиктор разделения, который минимизирует p - значение тестов хи-квадрата независимости между каждым предиктором и ответом. | Сопоставимый со стандартным CART |
Задайте, верно ли какое-либо из этих условий:
|
Тест взаимодействия [3] | 'interaction-curvature' | Выбирает предиктор разделения, который минимизирует p - значение тестов хи-квадрата независимости между каждым предиктором и ответом (то есть, проводит тесты искривления), и это минимизирует p - значение теста хи-квадрата независимости между каждой парой предикторов и ответом. | Медленнее, чем стандартный CART, особенно когда набор данных содержит много переменных предикторов. |
Задайте, верно ли какое-либо из этих условий:
|
Для получения дополнительной информации о методах выбора предиктора:
Для деревьев классификации смотрите PredictorSelection
и правила расщепления узлов.
Для деревьев регрессии смотрите PredictorSelection
и правила расщепления узлов.
Когда вы выращиваете дерево решений, рассматриваете его простоту и предсказательную силу. Глубокое дерево со многими листами обычно очень точно на обучающих данных. Однако дерево, как гарантируют, не покажет сопоставимую точность на независимом наборе тестов. Покрытое листвой дерево имеет тенденцию перетренироваться (или сверхподгонка), и ее тестовая точность часто далеко меньше ее обучения (перезамена) точность. В отличие от этого мелкое дерево не достигает высокой учебной точности. Но мелкое дерево может быть более устойчивым — его учебная точность могла быть близко к тому из представительного набора тестов. Кроме того, мелкое дерево легко интерпретировать. Если у вас нет достаточного количества данных для обучения и теста, оцените древовидную точность перекрестной проверкой.
fitctree
и fitrtree
имейте три аргумента пары "имя-значение", которые управляют глубиной получившихся деревьев решений:
MaxNumSplits
— Максимальным количеством разделений узла ветви является MaxNumSplits
на дерево. Установите большое значение для MaxNumSplits
получить глубокое дерево. Значением по умолчанию является size(X,1) – 1
.
MinLeafSize
— Каждый лист имеет, по крайней мере, MinLeafSize
наблюдения. Установите маленькие значения MinLeafSize
получить глубокие деревья. Значением по умолчанию является 1
.
MinParentSize
— Каждый узел ветви в дереве имеет, по крайней мере, MinParentSize
наблюдения. Установите маленькие значения MinParentSize
получить глубокие деревья. Значением по умолчанию является 10
.
Если вы задаете MinParentSize
и MinLeafSize
, ученик использует установку, которая дает к деревьям с большими листами (i.e., более мелкие деревья):
MinParent = max(MinParentSize,2*MinLeafSize)
Если вы предоставляете MaxNumSplits
, программное обеспечение разделяет дерево, пока одному из трех разделяющих критериев не удовлетворяют.
Для альтернативного метода управления древовидной глубиной смотрите Сокращение.
В этом примере показано, как управлять глубиной дерева решений, и как выбрать соответствующую глубину.
Загрузите 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.1054
Почти оптимальное дерево намного меньше и дает намного более высокую ошибку перезамены. Все же это дает подобную точность для перекрестных подтвержденных данных.
Сокращение оптимизирует древовидную глубину (густая листва) путем слияния листов на той же древовидной ветви. Управляйте Глубиной, или “Густая листва” описывает один метод для выбора оптимальной глубины для дерева. В отличие от этого, в том разделе, вы не должны выращивать новое дерево для каждого размера узла. Вместо этого вырастите глубокое дерево и сократите его к уровню, который вы выбираете.
Сократите дерево в командной строке с помощью 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.
ClassificationTree
| fitctree
| fitrtree
| predict (CompactClassificationTree)
| predict (CompactRegressionTree)
| prune (ClassificationTree)
| prune (RegressionTree)
| RegressionTree