Этот пример показывает, как получить преимущества алгоритмов TotalBoost
и LPBoost
. Эти алгоритмы совместно используют две выгодных характеристики:
Они самоотключают, что означает, что вы не должны выяснять сколько участников, чтобы включать.
Они производят ансамбли с некоторыми очень маленькими весами, позволяя вам безопасно удалить членов ансамбля.
Загрузите набор данных ionosphere
.
load ionosphere
Создайте ансамбли для классификации данных ionosphere
с помощью LPBoost
, TotalBoost
, и, для сравнения, алгоритмов AdaBoostM1
. Трудно знать сколько участников включать в ансамбль. Для LPBoost
и TotalBoost
, попытайтесь использовать 500
. Для сравнения также используйте 500
для AdaBoostM1
.
Слабые ученики по умолчанию для повышения методов являются деревьями решений с набором свойств MaxNumSplits
к 10
. Эти деревья имеют тенденцию соответствовать лучше, чем пни (с разделением максимума 1
) и могут сверхсоответствовать больше. Поэтому, чтобы предотвратить сверхподбор кривой, используйте пни в качестве слабых учеников для ансамблей.
rng('default') % For reproducibility T = 500; treeStump = templateTree('MaxNumSplits',1); adaStump = fitcensemble(X,Y,'Method','AdaBoostM1','NumLearningCycles',T,'Learners',treeStump); totalStump = fitcensemble(X,Y,'Method','TotalBoost','NumLearningCycles',T,'Learners',treeStump); lpStump = fitcensemble(X,Y,'Method','LPBoost','NumLearningCycles',T,'Learners',treeStump); figure plot(resubLoss(adaStump,'Mode','Cumulative')); hold on plot(resubLoss(totalStump,'Mode','Cumulative'),'r'); plot(resubLoss(lpStump,'Mode','Cumulative'),'g'); hold off xlabel('Number of stumps'); ylabel('Training error'); legend('AdaBoost','TotalBoost','LPBoost','Location','NE');
Все три алгоритма достигают совершенного прогноза на данных тренировки через некоторое время.
Исследуйте число членов во всех трех ансамблях.
[adaStump.NTrained totalStump.NTrained lpStump.NTrained]
ans = 1×3
500 52 75
AdaBoostM1
обучил всех участников 500
. Другие два алгоритма остановили обучение рано.
Крест подтверждает ансамбли, чтобы лучше определить точность ансамбля.
cvlp = crossval(lpStump,'KFold',5); cvtotal = crossval(totalStump,'KFold',5); cvada = crossval(adaStump,'KFold',5); figure plot(kfoldLoss(cvada,'Mode','Cumulative')); hold on plot(kfoldLoss(cvtotal,'Mode','Cumulative'),'r'); plot(kfoldLoss(cvlp,'Mode','Cumulative'),'g'); hold off xlabel('Ensemble size'); ylabel('Cross-validated error'); legend('AdaBoost','TotalBoost','LPBoost','Location','NE');
Результаты показывают, что каждый повышающий алгоритм достигает потери 10% или ниже с 50 членами ансамбля.
Чтобы уменьшать размеры ансамбля, уплотните их, и затем используйте removeLearners
. Вопрос, сколько учеников необходимо удалить? Перекрестные подтвержденные кривые потерь дают вам одну меру. Для другого исследуйте веса ученика на LPBoost
и TotalBoost
после уплотнения.
cada = compact(adaStump); clp = compact(lpStump); ctotal = compact(totalStump); figure subplot(2,1,1) plot(clp.TrainedWeights) title('LPBoost weights') subplot(2,1,2) plot(ctotal.TrainedWeights) title('TotalBoost weights')
И LPBoost
и TotalBoost
показывают ясные точки, где веса члена ансамбля становятся незначительными.
Удалите неважных членов ансамбля.
cada = removeLearners(cada,150:cada.NTrained); clp = removeLearners(clp,60:clp.NTrained); ctotal = removeLearners(ctotal,40:ctotal.NTrained);
Проверяйте, что удаление этих учеников не влияет на точность ансамбля на данных тренировки.
[loss(cada,X,Y) loss(clp,X,Y) loss(ctotal,X,Y)]
ans = 1×3
0 0 0
Проверяйте получившиеся компактные размеры ансамбля.
s(1) = whos('cada'); s(2) = whos('clp'); s(3) = whos('ctotal'); s.bytes
ans = 556787
ans = 222403
ans = 148103
Размеры компактных ансамблей приблизительно пропорциональны числу членов в каждом.
compact
| crossval
| fitcensemble
| kfoldLoss
| loss
| removeLearners
| resubLoss