TreeBagger
Statistics and Machine Learning Toolbox™ предлагает два объекта, которые поддерживают агрегацию начальной загрузки (укладывание в мешки) деревьев классификации: TreeBagger
создается при помощи TreeBagger
, и ClassificationBaggedEnsemble
создается при помощи fitcensemble
. Смотрите Сравнение TreeBagger и Уволенных Ансамблей для различий между TreeBagger
и ClassificationBaggedEnsemble
.
Этот пример показывает рабочий процесс для классификации, использующей функции в TreeBagger
только.
Используйте данные об ионосфере с 351 наблюдением и 34 предикторами с действительным знаком. Переменная отклика является категориальной с двумя уровнями:
'g'
представляет хороший радар, возвращается.
'b'
представляет плохой радар, возвращается.
Цель состоит в том, чтобы предсказать хорошие или плохие возвраты с помощью набора 34 измерений.
Зафиксируйте начальный случайный seed, вырастите 50 деревьев, осмотрите, как ошибочные изменения ансамбля с накоплением деревьев, и оценивают важность функции. Для классификации, лучше устанавливать минимальный листовой размер на 1 и выбирать квадратный корень из общего количества функций каждого разделения решения наугад. Эти настройки являются значениями по умолчанию для TreeBagger
, используемого для классификации.
load ionosphere rng(1945,'twister') b = TreeBagger(50,X,Y,'OOBPredictorImportance','On'); figure plot(oobError(b)) xlabel('Number of Grown Trees') ylabel('Out-of-Bag Classification Error')
Метод обучает ансамбли с немногими деревьями на наблюдениях, которые находятся в сумке для всех деревьев. Для таких наблюдений невозможно вычислить истинный прогноз из сумки, и TreeBagger
возвращает самый вероятный класс для классификации и демонстрационное среднее значение для регрессии. Можно изменить значение по умолчанию, возвращенное для наблюдений в сумке с помощью свойства DefaultYfit
. Если вы устанавливаете значение по умолчанию на пустой символьный вектор для классификации, метод исключает наблюдения в сумке из вычисления ошибки из сумки. В этом случае кривая является большим количеством переменной, когда количество деревьев является маленьким, также потому что некоторые наблюдения никогда не вне сумки (и поэтому исключены), или потому что их прогнозы основаны на немногих деревьях.
b.DefaultYfit = ''; figure plot(oobError(b)) xlabel('Number of Grown Trees') ylabel('Out-of-Bag Error Excluding In-Bag Observations')
Свойство OOBIndices
дорожек TreeBagger
, которые наблюдения вне сумки для какой деревья. Используя это свойство, можно контролировать часть наблюдений в данных тренировки, которые находятся в сумке для всех деревьев. Кривая запускается приблизительно в 2/3, который является частью уникальных наблюдений, выбранных одной копией начальной загрузки, и снижается 0 приблизительно в 10 деревьях.
finbag = zeros(1,b.NumTrees); for t=1:b.NTrees finbag(t) = sum(all(~b.OOBIndices(:,1:t),2)); end finbag = finbag / size(X,1); figure plot(finbag) xlabel('Number of Grown Trees') ylabel('Fraction of In-Bag Observations')
Оцените важность функции.
figure bar(b.OOBPermutedPredictorDeltaError) xlabel('Feature Index') ylabel('Out-of-Bag Feature Importance')
Выберите функции, приводящие к мере по важности, больше, чем 0,75. Этот порог выбран произвольно.
idxvar = find(b.OOBPermutedPredictorDeltaError>0.75)
idxvar = 1×6
3 5 6 7 8 27
Выбрав самые важные функции, вырастите более многочисленный ансамбль на уменьшаемом наборе функций. Сэкономьте время, не переставляя наблюдения из сумки, чтобы получить новые оценки важности функции для уменьшаемого набора функций (установите OOBVarImp
на 'off'
). Вы все еще интересовались бы получением оценок из сумки ошибки классификации (установите OOBPred
на 'on'
).
b5v = TreeBagger(100,X(:,idxvar),Y,'OOBPredictorImportance','off','OOBPrediction','on'); figure plot(oobError(b5v)) xlabel('Number of Grown Trees') ylabel('Out-of-Bag Classification Error')
Для ансамблей классификации, в дополнение к ошибке классификации (часть неправильно классифицированных наблюдений), можно также контролировать среднее поле классификации. Для каждого наблюдения поле задано как различие между счетом к истинному классу и максимальным счетом к другим классам, предсказанным этим деревом. Совокупное поле классификации использует очки, усредненные по всем деревьям, и среднее совокупное поле классификации является совокупным полем, усредненным по всем наблюдениям. Метод oobMeanMargin
с набором аргумента 'mode'
к 'cumulative'
(значение по умолчанию) показывает, как среднее совокупное поле изменяется, когда ансамбль растет: каждый новый элемент в возвращенном массиве представляет совокупное поле, полученное включением нового дерева в ансамбле. Если бы обучение успешно, вы ожидали бы видеть постепенное увеличение среднего поля классификации.
Метод обучает ансамбли с немногими деревьями на наблюдениях, которые находятся в сумке для всех деревьев. Для таких наблюдений невозможно вычислить истинный прогноз из сумки, и TreeBagger
возвращает самый вероятный класс для классификации и демонстрационное среднее значение для регрессии.
Для деревьев решений счет классификации является вероятностью наблюдения экземпляра этого класса в этом древовидном листе. Например, если лист выращенного дерева решений имеет пять 'good'
и три наблюдения обучения 'bad'
в нем, очки, возвращенные этим деревом решений для любого наблюдения, упавшего на этот лист, являются 5/8 для класса 'good'
и 3/8 для класса 'bad'
. Эти вероятности называются 'scores'
для непротиворечивости с другими классификаторами, которые не могут иметь очевидной интерпретации для числовых значений возвращенных прогнозов.
figure plot(oobMeanMargin(b5v)); xlabel('Number of Grown Trees') ylabel('Out-of-Bag Mean Classification Margin')
Вычислите матрицу близости и исследуйте распределение мер по выбросу. В отличие от регрессии, меры по выбросу для ансамблей классификации вычисляются в каждом классе отдельно.
b5v = fillProximities(b5v); figure histogram(b5v.OutlierMeasure) xlabel('Outlier Measure') ylabel('Number of Observations')
Найдите класс экстремальных выбросов.
extremeOutliers = b5v.Y(b5v.OutlierMeasure>40)
extremeOutliers = 3x1 cell array
{'g'}
{'g'}
{'g'}
percentGood = 100*sum(strcmp(extremeOutliers,'g'))/numel(extremeOutliers)
percentGood = 100
Все экстремальные выбросы маркированы 'good'
.
Что касается регрессии, можно построить масштабируемые координаты, отобразив эти два класса в различных цветах с помощью аргумента пары "имя-значение" 'Colors' mdsProx
. Этот аргумент берет вектор символов, в котором каждый символ представляет цвет. Программное обеспечение не оценивает имена классов. Поэтому это - лучшая практика определить положение классов в свойстве ClassNames
ансамбля.
gPosition = find(strcmp('g',b5v.ClassNames))
gPosition = 2
Класс 'bad'
является первым, и класс 'good'
является вторым. Отобразите масштабируемые координаты, использующие красный для класса 'bad'
и синий для наблюдений класса 'good'
.
figure [s,e] = mdsProx(b5v,'Colors','rb'); xlabel('First Scaled Coordinate') ylabel('Second Scaled Coordinate')
Постройте первые 20 собственных значений, полученных путем масштабирования. Первое собственное значение ясно доминирует, и первая масштабированная координата является самой важной.
figure bar(e(1:20)) xlabel('Scaled Coordinate Index') ylabel('Eigenvalue')
Другой способ исследовать производительность ансамбля классификации состоит в том, чтобы построить свою кривую Рабочей характеристики получателя (ROC) или другую кривую производительности, подходящую для текущей проблемы. Получите прогнозы для наблюдений из сумки. Для ансамбля классификации метод oobPredict
возвращает массив ячеек меток классификации как первый выходной аргумент и числовой массив очков как второй выходной аргумент. Возвращенный массив очков имеет два столбца, один для каждого класса. В этом случае первый столбец для класса 'bad'
, и второй столбец для класса 'good'
. Один столбец в матрице счета избыточен, потому что очки представляют вероятности класса в древовидных листах и по определению составляют в целом 1.
[Yfit,Sfit] = oobPredict(b5v);
Используйте perfcurve
, чтобы вычислить кривую производительности. По умолчанию perfcurve
возвращает стандартную кривую ROC, которая является истинным положительным уровнем по сравнению с ложным положительным уровнем. perfcurve
требует истинных меток класса, очков и положительной метки класса для входа. В этом случае выберите класс 'good'
в качестве положительного.
[fpr,tpr] = perfcurve(b5v.Y,Sfit(:,gPosition),'g'); figure plot(fpr,tpr) xlabel('False Positive Rate') ylabel('True Positive Rate')
Вместо стандартной кривой ROC вы можете хотеть построить, например, точность ансамбля по сравнению с порогом на счете к классу 'good'
. Входной параметр ycrit
perfcurve
позволяет вам задать критерий y
- ось, и третий выходной аргумент perfcurve
возвращает массив порогов для положительного счета класса. Точность является частью правильно классифицированных наблюдений, или эквивалентно, 1 минус ошибка классификации.
[fpr,accu,thre] = perfcurve(b5v.Y,Sfit(:,gPosition),'g','YCrit','Accu'); figure(20) plot(thre,accu) xlabel('Threshold for ''good'' Returns') ylabel('Classification Accuracy')
Кривая показывает плоскую область, указывающую, что любой порог от 0,2 до 0,6 является разумным выбором. По умолчанию perfcurve
присваивает метки классификации с помощью 0,5 как контур между этими двумя классами. Можно найти точно, какой точности это соответствует.
accu(abs(thre-0.5)<eps)
ans = 0x1 empty double column vector
Максимальная точность немного выше, чем по умолчанию.
[maxaccu,iaccu] = max(accu)
maxaccu = 0.9459
iaccu = 105
Оптимальный порог поэтому.
thre(iaccu)
ans = 0.4503
TreeBagger
| compact
| fitcensemble
| mdsprox
| oobError
| oobMeanMargin
| oobPredict
| perfcurve