В этом примере показано, как использовать краткий рабочий процесс для реализации инкрементного обучения для двоичной классификации с предварительной оценкой. В частности, этот пример делает следующее:
Создайте модель инкрементного обучения по умолчанию для двоичной классификации.
Симулируйте поток данных с помощью цикла for, который подает маленькие фрагменты наблюдений в алгоритм инкрементного обучения.
Для каждого фрагмента используйте updateMetricsAndFit
чтобы измерить производительность модели с учетом входящих данных, а затем подгонять модель к этим данным.
Несмотря на то, что этот пример рассматривает приложение как двоичную задачу классификации, можно реализовать многоклассовое инкрементальное обучение с использованием наивного алгоритма Байеса вместо этого путем следования этому же рабочему процессу. Смотрите incrementalClassificationNaiveBayes
объект.
Создайте модель инкрементного обучения по умолчанию для двоичной классификации.
Mdl = incrementalClassificationLinear()
Mdl = incrementalClassificationLinear IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' Beta: [0x1 double] Bias: 0 Learner: 'svm' Properties, Methods
Mdl
является incrementalClassificationLinear
объект модели. Все его свойства доступны только для чтения.
Mdl
необходимо соответствовать данным, прежде чем использовать их для выполнения любых других операций.
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity n = numel(actid); rng(1); % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Ответы могут быть одним из пяти классов: Сидя, Стоя, Ходьба, Бег, или Танцы. Дихотомизируйте ответ путем определения, движется ли субъект (actid
> 2).
Y = Y > 2;
Используйте краткий рабочий процесс, чтобы обновить метрики производительности модели и подгонять инкрементальную модель к обучающим данным путем вызова updateMetricsAndFit
функция. При каждой итерации:
Обработайте 50 наблюдений, чтобы симулировать поток данных.
Перезаписать предыдущую инкрементальную модель на новую, подобранную входящему наблюдению.
Сохраните совокупные метрики, метрики окна и первый коэффициент чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta1 = zeros(nchunk,1); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; beta1(j + 1) = Mdl.Beta(1); end
IncrementalMdl
является incrementalClassificationLinear
объект модели обучен на всех данных в потоке. Во время инкрементного обучения и после прогрева модели updateMetricsAndFit
проверяет эффективность модели при входящем наблюдении, а затем подбирает модель к этому наблюдению.
Чтобы увидеть, как метрики эффективности и развивался во время обучения, строил их на отдельных подграфиках.
figure; subplot(2,1,1) plot(beta1) ylabel('\beta_1') xlim([0 nchunk]); xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); subplot(2,1,2) h = plot(ce.Variables); xlim([0 nchunk]); ylabel('Classification Error') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xline((Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod)/numObsPerChunk,'g-.'); legend(h,ce.Properties.VariableNames) xlabel('Iteration')
График предполагает, что updateMetricsAndFit
делает следующее:
Подгонка во время всех итераций инкрементного обучения.
Вычислите показатели эффективности только после периода прогрева метрики.
Вычислите совокупные метрики во время каждой итерации.
Вычислите метрики окна после обработки 200 наблюдений (4 итерации).