updateMetrics

Обновляйте метрики эффективности в наивной модели классификации Байеса для инкрементного обучения с учетом новых данных

Описание

Данные потоковой передачи, updateMetrics измеряет эффективность сконфигурированной наивной классификационной модели Байеса для инкрементного обучения (incrementalClassificationNaiveBayes объект). updateMetrics сохраняет метрики эффективности в модели выхода.

updateMetrics позволяет проводить гибкое инкрементальное обучение. После вызова функции для обновления показателей производительности модели на входящем фрагменте данных можно выполнить другие действия, прежде чем обучать модель данным. Например, можно решить, нужно ли обучать модель на основе ее эффективности на фрагменте данных. Кроме того, можно как обновить метрики производительности модели, так и обучить модель на данных по мере их поступления, за один вызов, используя updateMetricsAndFit функция.

Чтобы измерить производительность модели для заданного пакета данных, вызовите loss вместо этого.

пример

Mdl = updateMetrics(Mdl,X,Y) возвращает наивную модель классификации Байеса для инкрементного обучения Mdl, которая является входной наивной моделью классификации Байеса для инкрементного обучения Mdl изменено, чтобы содержать метрики производительности модели на входящих данных предиктора и отклика, X и Y соответственно.

Когда модель входа warm (Mdl.IsWarm является true), updateMetrics перезаписывает ранее вычисленные метрики, хранящиеся в Metrics свойство с новыми значениями. В противном случае, updateMetrics хранит NaN значения в Metrics вместо этого.

Входная и выходная модели имеют совпадающий тип данных.

пример

Mdl = updateMetrics(Mdl,X,Y,'Weights',Weights) задает веса наблюдений Weights.

Примеры

свернуть все

Обучите наивную модель классификации Байеса с помощью fitcnbпреобразуйте его в пошагового ученика, а затем отслеживайте его эффективность в потоковые данные.

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

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

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

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

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

Подгонка наивной модели классификации Байеса к случайной выборке из половины данных.

idxtt = randsample([true false],n,true);
TTMdl = fitcnb(X(idxtt,:),Y(idxtt))
TTMdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
           NumObservations: 12053
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

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

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 1
                   Metrics: [1×2 table]
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

Инкрементальная модель теплая. Поэтому updateMetrics может отслеживать данные о метриках производительности модели.

Отслеживайте метрики эффективности

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

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

  2. Сохраните минимальные затраты и среднее значение первого предиктора в первом классе μ11.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
mu11 = [IncrementalMdl.DistributionParameters{1,1}(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));
    mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:};
    mu11(j + 1) = IncrementalMdl.DistributionParameters{1,1}(1);
end

IncrementalMdl является incrementalClassificationNaiveBayes объект модели, который отслеживал производительность модели до наблюдений в потоке данных.

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

figure;
subplot(2,1,1)
h = plot(mc.Variables);
xlim([0 nchunk]);
ylabel('Minimal Cost')
legend(h,mc.Properties.VariableNames)
subplot(2,1,2)
plot(mu11)
ylabel('\mu_{11}')
xlim([0 nchunk]);
xlabel('Iteration')

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

μ11 не меняется, потому что updateMetrics не соответствует модели данным.

Создайте наивную модель классификации Байеса для инкрементного обучения путем вызова incrementalClassificationNaiveBayes и указание в данных не более 5 ожидаемых классов. Укажите ошибочную классификацию ошибки отслеживания в сложении с минимальными затратами.

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'Metrics',"classiferror");

Mdl является incrementalClassificationNaiveBayes модель. Все его свойства доступны только для чтения.

Определите, является ли модель теплой, и размер периода прогрева метрики, запросив свойства модели.

isWarm = Mdl.IsWarm
isWarm = logical
   0

mwp = Mdl.MetricsWarmupPeriod
mwp = 1000

Mdl.IsWarm является 0; поэтому Mdl не тепло.

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

numObsBeforeMetrics = Mdl.MetricsWarmupPeriod
numObsBeforeMetrics = 1000

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

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

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

Предположим, что данные, собранные, когда субъект не двигался (Y < = 2) имеет удвоенное качество, чем при движении субъекта. Создайте весовую переменную, которая атрибутирует 2 наблюдениям, собранным от неподвижного субъекта, и 1 - движущемуся субъекту.

W = ones(n,1) + ~Y;

Реализуйте инкрементальное обучение путем выполнения следующих действий при каждой итерации:

  • Симулируйте поток данных путем обработки фрагмента 50 наблюдений.

  • Измерьте метрики производительности модели на входящем фрагменте с помощью updateMetrics. Задайте соответствующие веса наблюдений и перезаписайте модель входа.

  • Подбор модели к входящему фрагменту. Задайте соответствующие веса наблюдений и перезаписайте модель входа.

  • Магазин μ11 и вероятность ошибки неправильной классификации, чтобы увидеть, как они развиваются во время инкрементного обучения.

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
mu11 = zeros(nchunk,1);    

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx),'Weights',W(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    Mdl = fit(Mdl,X(idx,:),Y(idx),'Weights',W(idx));
    mu11(j) = Mdl.DistributionParameters{1,1}(1);
end

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

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

figure;
subplot(2,1,1)
plot(mu11)
ylabel('\mu_{11}')
xlabel('Iteration')
axis tight
subplot(2,1,2)
plot(ce.Variables);
ylabel('ClassificationError')
xline(numObsBeforeMetrics/numObsPerChunk,'r-.');
xlabel('Iteration')
xlim([0 nchunk]);
legend(ce.Properties.VariableNames)

mdlIsWarm = numObsBeforeMetrics/numObsPerChunk
mdlIsWarm = 20

График предполагает, что fit всегда подходит модель к данным, и updateMetrics не отслеживает ошибку классификации до окончания периода прогрева метрики (20 фрагменты).

Пошагово обучайте наивную модель классификации Байеса, только когда ее эффективность ухудшается.

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

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

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

Сконфигурируйте наивную модель классификации Байеса для инкрементного обучения так, чтобы максимальное количество ожидаемых классов было 5, отслеживаемая метрика эффективности включает ошибочную частоту ошибок классификации и размер окна метрики 1000. Подгонка сконфигурированной модели к первым 1000 наблюдениям.

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWindowSize',1000,...
    'Metrics','classiferror');
initobs = 1000;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

Mdl является incrementalClassificationNaiveBayes объект модели.

Выполните инкрементальное обучение с условным подбором кривой, выполнив эту процедуру для каждой итерации:

  • Симулируйте поток данных путем обработки фрагмента 100 наблюдений за раз.

  • Обновите производительность модели на входящем фрагменты данных.

  • Подгонка модели к фрагменту данных только тогда, когда вероятность ошибки неправильной классификации больше 0,05.

  • При отслеживании эффективности и подбора кривой перезаписайте предыдущую инкрементную модель.

  • Сохраните вероятность ошибки неправильной классификации и среднее значение первого предиктора во втором классе μ21 чтобы увидеть, как они развиваются во время обучения.

  • Отследите, когда fit обучает модель.

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
mu21 = zeros(nchunk,1);
ce = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    if ce{j,2} > 0.05
        Mdl = fit(Mdl,X(idx,:),Y(idx));
        trained(j) = true;
    end    
    mu21(j) = Mdl.DistributionParameters{2,1}(1);
end

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

Чтобы увидеть, как производительность модели и μ21 развивался во время обучения, строил их на отдельных подграфиках.

subplot(2,1,1)
plot(mu21)
hold on
plot(find(trained),mu21(trained),'r.')
ylabel('\mu_{21}')
legend('\mu_{21}','Training occurs','Location','best')
hold off
subplot(2,1,2)
plot(ce.Variables)
ylabel('Misclassification Error Rate')
xlabel('Iteration')
legend(ce.Properties.VariableNames,'Location','best')

График трассировки μ21 показывает периоды постоянных значений, в течение которых потеря в предыдущем окне наблюдения 1000 составляет самое большее 0,05.

Входные параметры

свернуть все

Модель инкрементного обучения, эффективность которой измеряется, задается как incrementalClassificationNaiveBayes объект модели. Можно создавать Mdl непосредственно или путем преобразования поддерживаемой, традиционно обученной модели машинного обучения с помощью incrementalLearner функция. Для получения дополнительной информации см. соответствующую страницу с описанием.

Если Mdl.IsWarm является false, updateMetrics не отслеживает эффективность модели. Прежде updateMetrics можно отслеживать показатели эффективности, необходимо выполнить все следующие действия:

  • Подбор модели входа Mdl ко всем ожидаемым классам (см MaxNumClasses и ClassNames аргументы incrementalClassificationNaiveBayes)

  • Подбор модели входа Mdl на Mdl.MetricsWarmupPeriod наблюдения путем прохождения Mdl и данные для fit . Для получения дополнительной информации см. «Показатели эффективности».

Фрагмент данных предиктора, с помощью которого можно измерить производительность модели

Длина меток наблюдений Y и количество наблюдений в X должна быть равной; Y (j) - метка j наблюдения (строка или столбец) в X.

Примечание

  • Если Mdl.NumPredictors = 0, updateMetrics выводит количество предикторов из X, и устанавливает свойство congruent модели выхода. В противном случае, если количество переменных предиктора в потоковых данных изменяется с Mdl.NumPredictors, updateMetrics выдает ошибку.

  • updateMetrics поддерживает только входные данные предиктора с плавающей точкой. Если модель входа Mdl представляет собой преобразованную, традиционно обученную модель, подходящую для категориальных данных, использование dummyvar чтобы преобразовать каждую категориальную переменную в числовую матрицу фиктивных переменных и объединить все фиктивные переменные матрицы и любые другие числовые предикторы. Для получения дополнительной информации см. Dummy Переменных.

Типы данных: single | double

Фрагмент меток, которым можно измерить производительность модели, заданный как категориальные символьные или строковые массивы, логический вектор или вектор с плавающей точкой или массив ячеек из векторов символов.

Длина меток наблюдений Y и количество наблюдений в X должна быть равной; Y (j) - метка j наблюдения (строка или столбец) в X. updateMetrics выдает ошибку, когда достигается по крайней мере одно из условий:

  • Y содержит вновь встречающуюся метку, и максимальное количество классов было достигнуто ранее (см MaxNumClasses и ClassNames аргументы incrementalClassificationNaiveBayes).

  • Типы данных Y и Mdl.ClassNames разные.

Типы данных: char | string | cell | categorical | logical | single | double

Фрагмент весов наблюдений, заданный как вектор с плавающей точкой положительных значений. updateMetrics взвешивает наблюдения в X с соответствующими значениями в Weights. Размер Weights должен равняться n, это количество наблюдений в X.

По умолчанию Weights это таковые (n,1).

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

Типы данных: double | single

Примечание

Если наблюдение (предиктор или метка) или вес Weight содержит по крайней мере один отсутствующий (NaN) значение, updateMetrics игнорирует наблюдение. Следовательно, updateMetrics использует меньше n наблюдений для вычисления производительности модели.

Выходные аргументы

свернуть все

Обновленная наивная модель классификации Байеса для инкрементного обучения, возвращенная как объект модели инкрементного обучения совпадающего типа данных, что и входная модель Mdl, an incrementalClassificationNaiveBayes объект.

Если модель не теплая, updateMetrics не вычисляет показатели эффективности. В результате этого Metrics свойство Mdl остатки полностью состоят из NaN значения. Если модель теплая, updateMetrics вычисляет совокупные и оконные метрики эффективности на новых данных X и Y, и перезаписывает соответствующие элементы Mdl.Metrics. Все другие свойства модели входа Mdl перенос в модель выхода Mdl. Для получения дополнительной информации см. «Показатели эффективности».

Совет

  • В отличие от традиционного обучения, инкрементальное обучение может не иметь отдельного теста (holdout) набора. Поэтому, чтобы обработать каждый входящий фрагмент данных как тестовый набор, передайте инкрементальную модель и каждый входящий фрагмент updateMetrics перед обучением модели на тех же данных используя fit.

Алгоритмы

свернуть все

Метрики эффективности

  • updateMetrics отслеживает только метрики производительности модели, заданные метками строк таблицы в Mdl.Metrics, из новых данных, когда инкрементальная модель warm (IsWarm свойство true). Инкрементальная модель тепла, когда fit функция выполняет оба из следующих действий:

    • Подгонка инкрементной модели к Mdl.MetricsWarmupPeriod наблюдения, что является metrics warm-up period.

    • Подгонка инкрементной модели ко всем ожидаемым классам (см MaxNumClasses и ClassNames аргументы incrementalClassificationNaiveBayes)

  • Mdl.Metrics сохраняет две формы каждой метрики эффективности как переменные (столбцы) таблицы, Cumulative и Window, с отдельными метриками в строках. Когда инкрементальная модель теплая, updateMetrics обновляет метрики на следующих частотах:

    • Cumulative - функция вычисляет совокупные метрики с начала отслеживания производительности модели. Функция обновляет метрики каждый раз, когда вы вызываете его, и основывает расчет на целом поставленном наборе данных.

    • Window - функция вычисляет метрики на основе всех наблюдений в окне, определенном Mdl.MetricsWindowSize свойство. Mdl.MetricsWindowSize также определяет частоту обновления программного обеспечения Window метрики. Для примера, если Mdl.MetricsWindowSize равен 20, функция вычисляет метрики на основе последних 20 наблюдений в предоставленных данных (X((end – 20 + 1):end,:) и Y((end – 20 + 1):end)).

      Инкрементальные функции, которые отслеживают метрики эффективности в окне, используют следующий процесс:

      1. Для каждой заданной метрики сохраните буфер длины Mdl.MetricsWindowSize и буфер весов наблюдений.

      2. Заполните элементы буфера метриков производительностью модели на основе пакетов входящих наблюдений и сохраните соответствующие веса наблюдений в буфере весов.

      3. Когда буфер будет заполнен, перезаписайте Mdl.Metrics.Window со средневзвешенной эффективностью в окне метрики. Если буфер переполнен, когда функция обрабатывает пакет наблюдений, последний входящий Mdl.MetricsWindowSize наблюдения заходят в буфер, и самые ранние наблюдения удаляются из буфера. Например, предположим Mdl.MetricsWindowSize 20, буфер метрики имеет 10 значений из ранее обработанного пакета и 15 значений являются входящими. Чтобы составить окно длины 20, функция использует измерения из 15 входящих наблюдений и последние 5 измерений из предыдущей партии.

Веса наблюдений

Для каждого условного распределения предиктора, updateMetrics вычисляет взвешенные средние значения и стандартное отклонение.

Если известное распределение вероятностей классов (другими словами, предшествующее распределение не эмпирическое), updateMetrics нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений по умолчанию являются соответствующими вероятностями предыдущего класса.

Если распределение вероятностей предыдущего класса эмпирическое, программное обеспечение нормализует указанные веса наблюдений до суммы 1 каждый раз, когда вы вызываете updateMetrics.

Введенный в R2021a