TreeBaggerStatistics 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')

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

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

Постройте график первых 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-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')

Кривая показывает плоскую область, указывающую, что любой порог от 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
compact | fitcensemble | mdsprox | oobError | oobMeanMargin | oobPredict | perfcurve | TreeBagger