Загрузите агрегацию (укладывание в мешки) деревьев регрессии Используя TreeBagger

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

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

Используйте базу данных 1 985 автомобильного импорта с 205 наблюдениями, 25 предикторов и 1 ответ, который является страховкой, рискуют оценивать, или "symboling". Первые 15 переменных являются числовыми, и последние 10 являются категориальными. Индекс symboling принимает целочисленные значения от-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

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

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

Красная кривая (листовой размер 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')

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

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

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

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

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

Рост деревьев на уменьшаемом наборе функций

Используя только эти четыре наиболее мощных функции, определите, возможно ли получить подобную предсказательную силу. Чтобы начаться, вырастите 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
bar(b5v.OOBPermutedPredictorDeltaError)
xlabel('Feature Index')
ylabel('Out-of-Bag Feature Importance')

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

Нахождение выбросов

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

b5v = fillProximities(b5v);

Метод нормирует эту меру путем вычитания средней меры по выбросу для целой выборки. Затем это берет значение этого различия и делит результат на среднее абсолютное отклонение для целой выборки.

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

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

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

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

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

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

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

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

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

  Properties, Methods

Можно сохранить получившуюся модель CompactTreeBagger в файле .mat *.

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

| | | | |

Похожие темы