Этот пример показывает, как обучить наивную модель классификации мутликласса Байеса для инкрементного обучения, только когда производительность модели неудовлетворительна.
Рабочий процесс гибкого инкрементного обучения позволяет вам обучать инкрементную модель на входящем пакете данных только тогда, когда это необходимо (см. «Что такое инкрементное обучение?»). Например, если метрики производительности модели удовлетворительны, то, чтобы повысить эффективность, можно пропустить обучение на входящих пакетах, пока метрики не станут неудовлетворительными.
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Сконфигурируйте наивную модель классификации Байеса для инкрементного обучения путем установки всех следующих:
Максимальное число ожидаемых классов - 5
Отслеживаемая метрика эффективности к вероятности ошибки неправильной классификации, которая также включает минимальные затраты
Размер окна метрики до 1000
Период прогрева метрики до 50
initobs = 50; Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWindowSize',1000,... 'Metrics','classiferror','MetricsWarmupPeriod',initobs);
Подгонка сконфигурированной модели к первым 50 наблюдениям.
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs))
Mdl = incrementalClassificationNaiveBayes IsWarm: 1 Metrics: [2×2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' DistributionNames: {1×60 cell} DistributionParameters: {5×60 cell} Properties, Methods
haveTrainedAllClasses = numel(unique(Y(1:initobs))) == 5
haveTrainedAllClasses = logical
1
Mdl
является incrementalClassificationNaiveBayes
объект модели. Модель теплая (IsWarm
является 1
) потому что применяются все следующие условия:
Исходные обучающие данные содержат все ожидаемые классы (haveTrainedAllClasses
является true
).
Mdl
был подходит для Mdl.MetricsWarmupPeriod
наблюдения.
Поэтому модель готова для генерации предсказаний, а инкрементальные функции обучения измеряют показатели эффективности в модели.
Предположим, что вы хотите обучить модель только, когда самые последние 1000 наблюдений имеют ошибку неправильной классификации, больше 5%.
Выполните инкрементальное обучение с условным обучением, следуя этой процедуре для каждой итерации:
Симулируйте поток данных путем обработки фрагмента 100 наблюдений за раз.
Обновите производительность модели, передав модель и текущий фрагмент данных в updateMetrics
. Перезаписать модель входа с помощью модели выхода.
Подгонка модели к фрагменту данных только тогда, когда вероятность ошибки неправильной классификации больше 0,05. Перезаписать модель входа с помощью модели выхода, когда происходит обучение.
Сохраните вероятность ошибки неправильной классификации и среднее значение первого предиктора во втором классе чтобы увидеть, как они развиваются во время обучения.
Отследите, когда fit
обучает модель.
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); mu21 = zeros(nchunk,1); ce = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]); trained = false(nchunk,1); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs); iend = min(n,numObsPerChunk*j + initobs); idx = ibegin:iend; Mdl = updateMetrics(Mdl,X(idx,:),Y(idx)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; if ce{j,"Window"} > 0.05 Mdl = fit(Mdl,X(idx,:),Y(idx)); trained(j) = true; end mu21(j) = Mdl.DistributionParameters{2,1}(1); end
Mdl
является incrementalClassificationNaiveBayes
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как производительность модели и развивался во время обучения, строил их на отдельных подграфиках. Идентифицируйте периоды, в течение которых модель была обучена.
subplot(2,1,1) plot(mu21) hold on plot(find(trained),mu21(trained),'r.') ylabel('\mu_{21}') legend('\mu_{21}','Training occurs','Location','best') hold off subplot(2,1,2) plot(ce.Variables) ylabel('Misclassification Error Rate') xlabel('Iteration') legend(ce.Properties.VariableNames,'Location','best')
График трассировки показывает периоды постоянных значений, в течение которых производительность модели в предыдущем окне наблюдения 1000 составляет самое большее 0,05.
fit
| predict
| updateMetrics