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

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

| | | | |

Похожие темы