exponenta event banner

Внедрение инкрементного обучения для классификации с использованием гибкого рабочего процесса

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

  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 обрабатывает больше кусков наблюдений.

См. также

Объекты

Функции

Связанные темы