Выполните условное обучение во время инкрементного обучения

Этот пример показывает, как обучить наивную модель классификации мутликласса Байеса для инкрементного обучения, только когда производительность модели неудовлетворительна.

Рабочий процесс гибкого инкрементного обучения позволяет вам обучать инкрементную модель на входящем пакете данных только тогда, когда это необходимо (см. «Что такое инкрементное обучение?»). Например, если метрики производительности модели удовлетворительны, то, чтобы повысить эффективность, можно пропустить обучение на входящих пакетах, пока метрики не станут неудовлетворительными.

Загрузка данных

Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.

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%.

Выполните инкрементальное обучение с условным обучением, следуя этой процедуре для каждой итерации:

  1. Симулируйте поток данных путем обработки фрагмента 100 наблюдений за раз.

  2. Обновите производительность модели, передав модель и текущий фрагмент данных в updateMetrics. Перезаписать модель входа с помощью модели выхода.

  3. Подгонка модели к фрагменту данных только тогда, когда вероятность ошибки неправильной классификации больше 0,05. Перезаписать модель входа с помощью модели выхода, когда происходит обучение.

  4. Сохраните вероятность ошибки неправильной классификации и среднее значение первого предиктора во втором классе μ21 чтобы увидеть, как они развиваются во время обучения.

  5. Отследите, когда 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 объект модели обучен на всех данных в потоке.

Чтобы увидеть, как производительность модели и μ21 развивался во время обучения, строил их на отдельных подграфиках. Идентифицируйте периоды, в течение которых модель была обучена.

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')

График трассировки μ21 показывает периоды постоянных значений, в течение которых производительность модели в предыдущем окне наблюдения 1000 составляет самое большее 0,05.

См. также

Объекты

Функции

Похожие темы