В этом примере показано, как использовать гибкий рабочий процесс, чтобы реализовать пошаговое обучение для бинарной классификации с prequential оценкой. Традиционно обученная модель инициализирует инкрементную модель. А именно, этот пример делает следующее:
Обучите линейную модель бинарной классификации на подмножестве данных.
Преобразуйте традиционно обученную модель в модель пошагового обучения для бинарной классификации.
Симулируйте поток данных с помощью цикла 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
процессы больше фрагментов наблюдений.