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
*
.
TreeBagger
| compact
| fillprox
| fitrensemble
| mdsprox
| oobError