exponenta event banner

Агрегация начальной загрузки (пакетирование) классификационных деревьев с использованием TreeBagger

Statistics and Machine Learning Toolbox™ предлагает два объекта, которые поддерживают агрегацию загрузочной полосы (пакетирование) деревьев классификации: TreeBagger создано с помощью TreeBagger и ClassificationBaggedEnsemble создано с помощью fitcensemble. См. Сравнение ансамблей TreeBagger и Bagged для различий между TreeBagger и ClassificationBaggedEnsemble.

В этом примере показан рабочий процесс классификации с использованием элементов в TreeBagger только.

Используйте данные ионосферы с 351 наблюдением и 34 реальными предикторами. Переменная ответа категорична с двумя уровнями:

  • 'g' представляет хорошую радиолокационную отдачу.

  • 'b' представляет плохие результаты радара.

Цель состоит в том, чтобы предсказать хорошие или плохие результаты, используя набор из 34 измерений.

Исправьте начальное случайное семя, вырастите 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')

Figure contains an axes. The axes contains an object of type line.

Метод тренирует ансамбли с небольшим количеством деревьев на наблюдениях, которые находятся в мешках для всех деревьев. Для таких наблюдений невозможно вычислить истинное предсказание вне пакета, и TreeBagger возвращает наиболее вероятный класс для классификации и среднее значение выборки для регрессии. Можно изменить значение по умолчанию, возвращаемое для наблюдений в сумке, используя DefaultYfit собственность. Если для классификации задано значение по умолчанию - пустой вектор символов, метод исключает наблюдения внутри сумки из вычисления ошибки вне сумки. В этом случае кривая является более переменной, когда число деревьев невелико, либо потому, что некоторые наблюдения никогда не выходят из-под контроля (и поэтому исключаются), либо потому, что их прогнозы основаны на нескольких деревьях.

b.DefaultYfit = '';
figure
plot(oobError(b))
xlabel('Number of Grown Trees')
ylabel('Out-of-Bag Error Excluding In-Bag Observations')

Figure contains an axes. The axes contains an object of type line.

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 contains an axes. The axes contains an object of type line.

Оценка важности функции.

figure
bar(b.OOBPermutedPredictorDeltaError)
xlabel('Feature Index')
ylabel('Out-of-Bag Feature Importance')

Figure contains an axes. The axes contains an object of type bar.

Выберите элементы, для которых значение важности превышает 0,75. Этот порог выбирается произвольно.

idxvar = find(b.OOBPermutedPredictorDeltaError>0.75)
idxvar = 1×5

     3     5     7     8    27

Выбрав наиболее важные элементы, вырастите более крупный ансамбль на уменьшенном наборе элементов. Экономьте время, не переставляя наблюдения вне пакета, чтобы получить новые оценки важности элемента для уменьшенного набора элементов (set 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')

Figure contains an axes. The axes contains an object of type line.

Для классификационных ансамблей, помимо ошибки классификации (доли неправильно классифицированных наблюдений), можно также контролировать средний запас классификации. Для каждого наблюдения запас определяется как разница между баллом для истинного класса и максимальным баллом для других классов, прогнозируемым этим деревом. В кумулятивной классификационной марже используются оценки, усредненные по всем деревьям, а средняя кумулятивная классификационная маржа представляет собой кумулятивную маржу, усредненную по всем наблюдениям. 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')

Figure contains an axes. The axes contains an object of type line.

Вычислите матрицу ближайших значений и изучите распределение отклонений. В отличие от регрессии, более низкие показатели для классификационных ансамблей вычисляются в каждом классе отдельно.

b5v = fillProximities(b5v);
figure
histogram(b5v.OutlierMeasure)
xlabel('Outlier Measure')
ylabel('Number of Observations')

Figure contains an axes. The axes contains an object of type histogram.

Найдите класс экстремальных отклонений.

extremeOutliers = b5v.Y(b5v.OutlierMeasure>40)
extremeOutliers = 6x1 cell
    {'g'}
    {'g'}
    {'g'}
    {'g'}
    {'g'}
    {'g'}

percentGood = 100*sum(strcmp(extremeOutliers,'g'))/numel(extremeOutliers)
percentGood = 100

Все экстремальные отклонения помечены 'good'.

Что касается регрессии, можно построить график масштабированных координат, отображая два класса в разных цветах с помощью аргумента пары имя-значение «Цвета» 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')

Figure contains an axes. The axes contains 2 objects of type scatter. These objects represent b, g.

Постройте график первых 20 собственных значений, полученных масштабированием. Первое собственное значение явно доминирует, и наиболее важна первая масштабированная координата.

figure
bar(e(1:20))
xlabel('Scaled Coordinate Index')
ylabel('Eigenvalue')

Figure contains an axes. The axes contains an object of type bar.

Другим способом исследования производительности классификационного ансамбля является построение графика его кривой рабочей характеристики приемника (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')

Figure contains an axes. The axes contains an object of type line.

Вместо стандартной ROC-кривой может потребоваться построить график, например, точность ансамбля в сравнении с порогом для оценки 'good' класс. ycrit входной аргумент perfcurve позволяет указать критерий для y-axis и третий выходной аргумент 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')

Figure contains an axes. The axes contains an object of type line.

Кривая показывает плоскую область, указывающую, что любой порог от 0,2 до 0,6 является разумным выбором. По умолчанию perfcurve присваивает метки классификации, используя 0.5 в качестве границы между двумя классами. Вы можете найти, какой именно точности это соответствует.

accu(abs(thre-0.5)<eps)
ans = 0.9316

Максимальная точность немного выше, чем по умолчанию.

[maxaccu,iaccu] = max(accu)
maxaccu = 0.9345
iaccu = 99

Поэтому оптимальным порогом является.

thre(iaccu)
ans = 0.5278

См. также

| | | | | | |

Связанные темы