updateMetricsAndFit

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

Описание

Данные потоковой передачи, updateMetricsAndFit сначала оценивает эффективность сконфигурированной наивной классификационной модели Байеса для инкрементного обучения (incrementalClassificationNaiveBayes объект) вызовом updateMetrics о поступающих данных. Тогда updateMetricsAndFit подходит для модели с этими данными путем вызова fit. Другими словами, updateMetricsAndFit выполняет prequential evaluation, потому что он обрабатывает каждый входящий фрагмент данных как тестовый набор и отслеживает метрики эффективности, измеренные кумулятивно и в заданном окне [1].

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

пример

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

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

  2. updateMetricsAndFit подбирает измененную модель к входящим данным путем обновления условного апостериорного среднего и стандартного отклонения каждой переменной предиктора, учитывая класс, и хранит новые оценки, среди прочего строения в модели выхода Mdl.

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

пример

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

Примеры

свернуть все

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

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5)
Mdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 0
                   Metrics: [1×2 table]
                ClassNames: [1×0 double]
            ScoreTransform: 'none'
         DistributionNames: 'normal'
    DistributionParameters: {}


  Properties, Methods

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

Mdl необходимо соответствовать данным, прежде чем использовать их для выполнения любых других операций.

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

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

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

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

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

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

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

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

Mdl является incrementalClassificationNaiveBayes объект модели обучен на всех данных в потоке. Во время инкрементного обучения и после прогрева модели updateMetricsAndFit проверяет эффективность модели при входящем наблюдении, а затем подбирает модель к этому наблюдению.

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

figure;
subplot(2,1,1)
plot(mu11)
ylabel('\beta_1')
xlim([0 nchunk]);
subplot(2,1,2)
h = plot(mc.Variables);
xlim([0 nchunk]);
ylabel('Minimal Cost')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,mc.Properties.VariableNames)
xlabel('Iteration')

График предполагает, что updateMetricsAndFit делает следующее:

  • Подгонка μ11 во время всех итераций инкрементного обучения.

  • Вычислите показатели эффективности только после периода прогрева метрики.

  • Вычислите совокупные метрики во время каждой итерации.

  • Вычислите метрики окна после обработки 500 наблюдений.

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

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

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

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

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

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

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

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

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

idxtt = randsample([true false],n,true);
TTMdl = fitcnb(X(idxtt,:),Y(idxtt),'Weights',W(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,'Metrics',"classiferror")
IncrementalMdl = 
  incrementalClassificationNaiveBayes

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


  Properties, Methods

IncrementalMdl является incrementalClassificationNaiveBayes модель. Поскольку имена классов заданы в Mdl.ClassNamesМетки, с которыми сталкиваются во время инкрементного обучения, должны быть в Mdl.ClassNames.

Отдельно отслеживайте метрики эффективности и подгоняйте модель

Выполните инкрементальное обучение для остальных данных с помощью updateMetricsAndfit функция. При каждой итерации:

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

  2. Функции updateMetricsAndFit обновить совокупные и оконные метрики эффективности модели с учетом входящего фрагмента наблюдений, а затем подгонять модель к данным. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics свойство. Задайте веса наблюдений.

  3. Сохраните ошибку классификации.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
Xil = X(idxil,:);
Yil = Y(idxil);
Wil = W(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(idx,:),Yil(idx),...
        'Weights',Wil(idx));
    mc{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
end

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

Постройте график трассировки частоты ошибок неправильной классификации.

h = plot(mc.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
legend(h,mc.Properties.VariableNames)
xlabel('Iteration')

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

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

свернуть все

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

Если Mdl.IsWarm является false, updateMetricsAndFit не отслеживает эффективность модели. Для получения дополнительной информации см. «Показатели эффективности».

Фрагмент данных предиктора, с помощью которых можно измерить производительность модели, а затем подогнать модель к, заданному как n -by- Mdl.NumPredictors матрица с плавающей точкой.

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

свернуть все

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

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

Если на ClassNames свойство модели входа Mdl - пустой массив, updateMetricsAndFit устанавливает ClassNames свойство модели выхода Mdl на unique(Y). Если максимальное количество классов не достигнуто, updateMetricsAndFit добавляется к Mdl.ClassNames все вновь встретившиеся метки в Y.

Алгоритмы

свернуть все

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

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

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

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

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

    • 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 измерений из предыдущей партии.

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

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

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

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

Ссылки

[1] Бифет, Альберт, Рикард Гавальда, Джеффри Холмс и Бернгард Пфахрингер. Machine Learning for Data Streams with Practical Example in MOA. Cambridge, MA: The MIT Press, 2007.

Введенный в R2021a