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

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

| | | | | | |

Похожие темы