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
файл.
compact
| fillprox
| fitrensemble
| mdsprox
| oobError
| TreeBagger