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
{'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