exponenta event banner

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

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

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

Используйте базу данных по импорту автомобилей 1985 года с 205 наблюдениями, 25 предикторами и 1 ответом, который является рейтингом страхового риска, или «символизирующим». Первые 15 переменных являются числовыми, а последние 10 категориальными. Индекс символа принимает целочисленные значения от -3 до 3.

Загрузите набор данных и разбейте его на массивы предикторов и ответов.

load imports-85
Y = X(:,1);
X = X(:,2:end);
isCategorical = [zeros(15,1);ones(size(X,2)-15,1)]; % Categorical variable flag

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

rng(1945,'twister')

Поиск оптимального размера листа

Для регрессии общим правилом является установка размера листа в 5 и выбор одной трети входных признаков для случайного разделения решения. На следующем этапе проверьте оптимальный размер листа путем сравнения среднеквадратичных ошибок, полученных регрессией для различных размеров листа. oobError вычисляет MSE в сравнении с количеством выращенных деревьев. Необходимо установить OOBPred кому 'On' для получения предсказаний из мешка позже.

leaf = [5 10 20 50 100];
col = 'rbcmy';
figure
for i=1:length(leaf)
    b = TreeBagger(50,X,Y,'Method','R','OOBPrediction','On',...
			'CategoricalPredictors',find(isCategorical == 1),...
            'MinLeafSize',leaf(i));
    plot(oobError(b),col(i))
    hold on
end
xlabel('Number of Grown Trees')
ylabel('Mean Squared Error') 
legend({'5' '10' '20' '50' '100'},'Location','NorthEast')
hold off

Figure contains an axes. The axes contains 5 objects of type line. These objects represent 5, 10, 20, 50, 100.

Красная кривая (размер листа 5) дает самые низкие значения MSE.

Оценка важности элемента

В практических применениях вы обычно выращиваете ансамбли с сотнями деревьев. Например, предыдущий блок кода использует 50 деревьев для более быстрой обработки. Теперь, когда вы оценили оптимальный размер листа, вырастите более крупный ансамбль с 100 деревьями и используйте его для оценки важности особенностей.

b = TreeBagger(100,X,Y,'Method','R','OOBPredictorImportance','On',...
    'CategoricalPredictors',find(isCategorical == 1),...
    'MinLeafSize',5);

Проверьте кривую ошибки еще раз, чтобы убедиться, что во время обучения ничего не пошло не так.

figure
plot(oobError(b))
xlabel('Number of Grown Trees')
ylabel('Out-of-Bag Mean Squared Error')

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

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

Для каждого признака переставьте значения этого признака для каждого наблюдения в наборе данных и измерьте, насколько хуже становится MSE после перестановки. Это можно повторить для каждого элемента.

Постройте график увеличения MSE из-за перестановки наблюдений вне пакета для каждой входной переменной. OOBPermutedPredictorDeltaError массив сохраняет усредненное по всем деревьям в ансамбле увеличение MSE и деленное на стандартное отклонение, принятое за деревья, для каждой переменной. Чем больше это значение, тем важнее переменная. Навязывая произвольное отсечение 0,7, можно выбрать четыре наиболее важных элемента.

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

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

idxvar = find(b.OOBPermutedPredictorDeltaError>0.7)
idxvar = 1×4

     1     2    16    19

idxCategorical = find(isCategorical(idxvar)==1);

OOBIndices имущество TreeBagger отслеживает, какие наблюдения вне мешка для каких деревьев. С помощью этого свойства можно отслеживать долю наблюдений в учебных данных, которые находятся в мешке для всех деревьев. Кривая начинается приблизительно с 2/3, что является долей уникальных наблюдений, выбранных одной репликой начальной загрузки, и снижается до 0 при приблизительно 10 деревьях.

finbag = zeros(1,b.NTrees);
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.

Выращивание деревьев на уменьшенном наборе функций

Используя только четыре наиболее мощные функции, определите, можно ли получить подобную прогностическую силу. Для начала выращивайте только 100 деревьев на этих элементах. Первые два из четырех выбранных элементов являются числовыми, а последние два категориальными.

b5v = TreeBagger(100,X(:,idxvar),Y,'Method','R',...
    'OOBPredictorImportance','On','CategoricalPredictors',idxCategorical,...
    'MinLeafSize',5);
figure
plot(oobError(b5v))
xlabel('Number of Grown Trees')
ylabel('Out-of-Bag Mean Squared Error')

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

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

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

Эти четыре наиболее мощные функции дают тот же MSE, что и полный набор, и ансамбль, обученный на сокращенном наборе, ранжирует эти функции аналогично друг другу. Если удалить элементы 1 и 2 из уменьшенного набора, прогнозирующая мощность алгоритма может существенно не уменьшиться.

Поиск отклонений

Чтобы найти отклонения в данных обучения, вычислите матрицу близости с помощью fillProximities.

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.

Обнаружение кластеров в данных

Применяя многомерное масштабирование к вычисленной матрице проксимальности, можно проверить структуру входных данных и искать возможные кластеры наблюдений. mdsProx метод возвращает масштабированные координаты и собственные значения для вычисленной матрицы близости. Если запустить его с помощью Colors аргумент «имя-значение-пара», затем этот метод создает график рассеяния с двумя масштабированными координатами.

figure(8)
[~,e] = mdsProx(b5v,'Colors','K');
xlabel('First Scaled Coordinate')
ylabel('Second Scaled Coordinate')

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

Оцените относительную важность масштабированных осей, построив первые 20 собственных значений.

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

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

Сохранение конфигурации ансамбля для будущего использования

Чтобы использовать обученный ансамбль для прогнозирования реакции на невидимые данные, сохраните ансамбль на диске и извлеките его позже. Если вы не хотите вычислять прогнозы для данных вне пакета или повторно использовать данные обучения каким-либо другим способом, нет необходимости хранить сам объект ансамбля. Сохранения компактной версии ансамбля в данном случае достаточно. Извлеките компактный объект из ансамбля.

c = compact(b5v)
c = 
  CompactTreeBagger
Ensemble with 100 bagged decision trees:
              Method:           regression
       NumPredictors:                    4

  Properties, Methods

Полученные данные можно сохранить CompactTreeBagger модель в *.mat файл.

См. также

| | | | |

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