Реализуйте инкрементальное обучение для классификации с помощью гибкого рабочего процесса

В этом примере показано, как использовать гибкий рабочий процесс для реализации инкрементного обучения для двоичной классификации с предварительной оценкой. Традиционно обученная модель инициализирует инкрементальную модель. В частности, этот пример делает следующее:

  1. Обучите линейную модель для двоичной классификации на подмножестве данных.

  2. Преобразуйте традиционно обученную модель в модель инкрементного обучения для двоичной классификации.

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

  4. Для каждого фрагмента используйте updateMetrics для измерения производительности модели с учетом входящих данных и затем используйте fit для соответствия модели этим данным.

Несмотря на то, что этот пример рассматривает приложение как двоичную задачу классификации, можно реализовать многоклассовое инкрементальное обучение с использованием наивного алгоритма Байеса вместо этого путем следования этому же рабочему процессу. Смотрите incrementalClassificationNaiveBayes объект.

Загрузка и предварительная обработка данных

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

load humanactivity
rng(1); % For reproducibility
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:)';
Y = actid(idx);

Для получения дополнительной информации о наборе данных введите Description в командной строке.

Ответы могут быть одним из пяти классов: Сидя, Стоя, Ходьба, Бег, или Танцы. Дихотомизируйте ответ путем определения, движется ли субъект (actid > 2).

Y = Y > 2;

Обучите линейную модель для двоичной классификации

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

idxtt = randsample([true false],n,true);
TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns')
TTMdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60x1 double]
              Bias: -0.4621
            Lambda: 8.2967e-05
           Learner: 'svm'


  Properties, Methods

TTMdl является ClassificationLinear объект модели, представляющий традиционно обученную линейную модель для двоичной классификации.

Преобразуйте обученную модель

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

            IsWarm: 1
           Metrics: [1x2 table]
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60x1 double]
              Bias: -0.4621
           Learner: 'svm'


  Properties, Methods

Реализация инкрементного обучения

Используйте гибкий рабочий процесс, чтобы обновить метрики производительности модели и подгонять инкрементальную модель к обучающим данным путем вызова updateMetrics и fit функционирует отдельно. Симулируйте поток данных путем обработки 50 наблюдений за раз. При каждой итерации:

  1. Функции updateMetrics обновить совокупную и оконную ошибку классификации модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели. Задайте, что наблюдения ориентированы в столбцах.

  2. Функции fit для подгонки модели к входящему фрагменту наблюдений. Перезаписайте предыдущую инкрементную модель, чтобы обновить параметры модели. Задайте, что наблюдения ориентированы в столбцах.

  3. Сохраните ошибку классификации и первый оцененный коэффициент β1.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta1 = [IncrementalMdl.Beta(1); zeros(nchunk,1)];
Xil = X(:,idxil);
Yil = Y(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,Xil(:,idx),Yil(idx),...
        'ObservationsIn','columns');
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns');
    beta1(j + 1) = IncrementalMdl.Beta(end);
end

IncrementalMdl является incrementalClassificationLinear объект модели обучен на всех данных в потоке.

Также можно использовать updateMetricsAndFit чтобы обновить метрики эффективности модели, заданные новый фрагмент данных, и затем подгонять модель к данным.

Смотрите эволюцию модели

Постройте график трассировки метрик эффективности и оценочного коэффициента β1.

figure;
subplot(2,1,1)
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
legend(h,ce.Properties.VariableNames)
subplot(2,1,2)
plot(beta1)
ylabel('\beta_1')
xlim([0 nchunk]);
xlabel('Iteration')

Figure contains 2 axes. Axes 1 contains 2 objects of type line. These objects represent Cumulative, Window. Axes 2 contains an object of type line.

Совокупные потери стабильны и постепенно уменьшаются, в то время как потери окна скачут.

β1 сначала резко изменяется, а затем постепенно выравнивается как fit обрабатывает больше фрагменты наблюдений.

См. также

Объекты

Функции

Похожие темы