В этом примере показано, как использовать гибкий рабочий процесс для реализации инкрементного обучения для двоичной классификации с предварительной оценкой. Традиционно обученная модель инициализирует инкрементальную модель. В частности, этот пример делает следующее:
Обучите линейную модель для двоичной классификации на подмножестве данных.
Преобразуйте традиционно обученную модель в модель инкрементного обучения для двоичной классификации.
Симулируйте поток данных с помощью цикла for, который подает маленькие фрагменты наблюдений в алгоритм инкрементного обучения.
Для каждого фрагмента используйте 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 наблюдений за раз. При каждой итерации:
Функции updateMetrics
обновить совокупную и оконную ошибку классификации модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics
свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели. Задайте, что наблюдения ориентированы в столбцах.
Функции fit
для подгонки модели к входящему фрагменту наблюдений. Перезаписайте предыдущую инкрементную модель, чтобы обновить параметры модели. Задайте, что наблюдения ориентированы в столбцах.
Сохраните ошибку классификации и первый оцененный коэффициент .
% 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
чтобы обновить метрики эффективности модели, заданные новый фрагмент данных, и затем подгонять модель к данным.
Постройте график трассировки метрик эффективности и оценочного коэффициента .
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')
Совокупные потери стабильны и постепенно уменьшаются, в то время как потери окна скачут.
сначала резко изменяется, а затем постепенно выравнивается как fit
обрабатывает больше фрагменты наблюдений.