Загрузите агрегацию (укладывание в мешки) деревьев классификации Используя 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

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

| | | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте