Можно настроить деревья, установив пары "имя-значение" в 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. Это демонстрирует, что перекрестные подтвержденные потери обычно выше, чем простые потери на реституцию.
Стандартный алгоритм ТЕЛЕЖКА имеет тенденцию выбирать непрерывные предикторы, которые имеют много уровней. Иногда такой выбор может быть ложным и может также замаскировать более важные предикторы, которые имеют меньше уровней, такие как категориальные предикторы. То есть процесс выбора предиктора в каждом узле смещен. Кроме того, стандартная ТЕЛЕЖКА имеет тенденцию пропускать важные взаимодействия между парами предикторов и откликом.
Чтобы уменьшить смещение выбора и увеличить обнаружение важных взаимодействий, можно задать использование тестов кривизны или взаимодействия с помощью 'PredictorSelection'
аргумент пары "имя-значение". Использование критерия кривизны или взаимодействия имеет дополнительное преимущество создания лучших оценок предикторной важности, чем стандартная ТЕЛЕЖКА.
Эта таблица суммирует поддерживаемые методы выбора предиктора.
Метод | 'PredictorSelection' Значение | Описание | Скорость обучения | Когда задавать |
---|---|---|---|---|
Стандартная ТЕЛЕЖКА [1] | Дефолт |
Выбирает предиктор разделения, который максимизирует коэффициент усиления разделения по всем возможным разделениям всех предикторов. | Базовый уровень для сравнения |
Укажите, верны ли какие-либо из этих условий:
|
Тест кривизны [2][3] | 'curvature' | Выбирает предиктор разделения, который минимизирует p-значение хи-квадратных тестов независимости между каждым предиктором и ответом. | Сопоставимо со стандартной ТЕЛЕЖКА |
Укажите, верны ли какие-либо из этих условий:
|
Тест взаимодействия [3] | 'interaction-curvature' | Выбирает предиктор разделения, который минимизирует p-значение хи-квадратных тестов независимости между каждым предиктором и ответом (то есть проводит тесты кривизны), и что минимизирует p-значение хи-квадратного теста независимости между каждой парой предикторов и ответом. | Медленнее, чем стандартная ТЕЛЕЖКА, особенно когда набор данных содержит много переменных предиктора. |
Укажите, верны ли какие-либо из этих условий:
|
Для получения дополнительной информации о методах выбора предиктора:
Деревья классификации см. в разделе PredictorSelection
и правила разделения узлов.
Для деревьев регрессии смотрите PredictorSelection
и правила разделения узлов.
Когда вы выращиваете дерево решений, учитывайте его простоту и прогнозирующую степень. Глубокое дерево со многими листьями обычно очень точно на обучающих данных. Однако дерево не гарантировано показывает сопоставимую точность на независимом тестовом наборе. Листовое дерево имеет тенденцию к переобучению (или сверхподгонке), и его точность теста часто намного меньше, чем точность обучения (реституции). Напротив, мелкое дерево не достигает высокой точности обучения. Но мелкое дерево может быть более устойчивым - его точность обучения может быть близка к точности обучения репрезентативного тестового набора. Также неглубокое дерево легко интерпретировать. Если у вас нет достаточных данных для обучения и тестирования, оцените точность дерева путем перекрестной валидации.
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
программа разделяет дерево до тех пор, пока не будет удовлетворен один из трех критериев разделения.
Альтернативный метод управления глубиной дерева см. в разделе Обрезка.
В этом примере показано, как контролировать глубину дерева решений и как выбрать соответствующую глубину.
Загрузите 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
Почти оптимальное дерево намного меньше и дает гораздо более высокую ошибку реституции. Тем не менее, это дает аналогичную точность для перекрестных проверенных данных.
Обрезка оптимизирует глубину дерева (листность) путем слияния листьев на той же ветви дерева. Control Depth или «Leafiness» описывает один метод выбора оптимальной глубины для дерева. В отличие от этого раздела, вам не нужно выращивать новое дерево для каждого размера узла. Вместо этого вырастите глубокое дерево и обрежьте его до уровня, который вы выберете.
Обрезать дерево в командной строке используя 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] Breiman, L., J. H. Friedman, R. A. Olshen, and C. J. Stone. Деревья классификации и регрессии. Бока Ратон, FL: Chapman & Hall, 1984.
[2] Loh, W.Y. and Y.S. Shih. «Разделение методов выбора для деревьев классификации». Statistica Sinica, Vol. 7, 1997, pp. 815-840.
[3] Loh, W.Y. «Regression Trees with Unbiased Variable Selection and Interaction Detection». Statistica Sinica, Vol. 12, 2002, pp. 361-386.
ClassificationTree
| fitctree
| fitrtree
| predict (CompactClassificationTree)
| predict (CompactRegressionTree)
| prune (ClassificationTree)
| prune (RegressionTree)
| RegressionTree