updateMetrics

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

Описание

Данные потоковой передачи, updateMetrics измеряет эффективность сконфигурированной модели инкрементного обучения для линейной регрессии (incrementalRegressionLinear объект) или линейная двоичная классификация (incrementalClassificationLinear объект). 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,Name,Value) использует дополнительные опции, заданные одним или несколькими аргументами пары "имя-значение". Например, можно задать, что столбцы матрицы данных предиктора соответствуют наблюдениям, и задать веса наблюдений.

Примеры

свернуть все

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

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

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

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))
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

IncrementalMdl.IsWarm
ans = logical
   1

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

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

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

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

  2. Сохраните ошибку классификации и первый коэффициент β1.

% 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));
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    beta1(j + 1) = IncrementalMdl.Beta(1);
end

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

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

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')

Figure contains 2 axes. Axes 1 contains 2 objects of type line. These objects represent Cumulative, Window. Axes 2 contains an object of type line.

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

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

Создайте инкрементальную линейную модель SVM для двоичной классификации. Задайте период оценки 5000 наблюдений и решателя SGD.

Mdl = incrementalClassificationLinear('EstimationPeriod',5000,'Solver','sgd')
Mdl = 
  incrementalClassificationLinear

            IsWarm: 0
           Metrics: [1x2 table]
        ClassNames: [1x0 double]
    ScoreTransform: 'none'
              Beta: [0x1 double]
              Bias: 0
           Learner: 'svm'


  Properties, Methods

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

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

isWarm = Mdl.IsWarm
isWarm = logical
   0

mwp = Mdl.MetricsWarmupPeriod
mwp = 1000

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

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

numObsBeforeMetrics = Mdl.MetricsWarmupPeriod + Mdl.EstimationPeriod
numObsBeforeMetrics = 6000

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

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;

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

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

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

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

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

% 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 = updateMetrics(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    Mdl = fit(Mdl,X(idx,:),Y(idx));
    beta1(j) = Mdl.Beta(1);
end

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

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

figure;
subplot(2,1,1)
plot(beta1)
ylabel('\beta_1')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight
subplot(2,1,2)
plot(ce.Variables);
ylabel('ClassificationError')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xline(numObsBeforeMetrics/numObsPerChunk,'g-.');
xlabel('Iteration')
xlim([0 nchunk]);
legend(ce.Properties.VariableNames)

Figure contains 2 axes. Axes 1 contains 2 objects of type line, constantline. Axes 2 contains 4 objects of type line, constantline. These objects represent Cumulative, Window.

mdlIsWarm = numObsBeforeMetrics/numObsPerChunk
mdlIsWarm = 120

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

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

Загрузите и перетащите набор данных о корпусе NYC 2015 года. Для получения дополнительной информации о данных смотрите Открытые данные NYC.

load NYCHousing2015

rng(1) % For reproducibility
n = size(NYCHousing2015,1);
shuffidx = randsample(n,n);
NYCHousing2015 = NYCHousing2015(shuffidx,:);

Извлеките переменную отклика SALEPRICE со таблицы. Для числовой устойчивости шкалы SALEPRICE по 1e6.

Y = NYCHousing2015.SALEPRICE/1e6;
NYCHousing2015.SALEPRICE = [];

Создайте фиктивные матрицы из категориальных предикторов.

catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"];
dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015,...
    'InputVariables',catvars);
dumvarmat = table2array(dumvarstbl);
NYCHousing2015(:,catvars) = [];

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

idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform');
X = [dumvarmat NYCHousing2015{:,idxnum}]';

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

Mdl = incrementalRegressionLinear('EstimationPeriod',0,'MetricsWarmupPeriod',0,...
    'MetricsWindowSize',1000);
numObsPerChunk = 100;
Mdl = fit(Mdl,X(:,1:numObsPerChunk),Y(1:numObsPerChunk),'ObservationsIn','columns');

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

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

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

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

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

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

  • Сохраните эпсилон нечувствительные потери и β313 чтобы увидеть, как изменяются потери и коэффициент во время обучения.

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

% Preallocation
n = numel(Y) - numObsPerChunk;
nchunk = floor(n/numObsPerChunk);
beta313 = zeros(nchunk,1);
ei = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% Incremental fitting
for j = 2:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(:,idx),Y(idx),'ObservationsIn','columns');
    ei{j,:} = Mdl.Metrics{"EpsilonInsensitiveLoss",:};
    minei = min(ei{:,2});
    pdiffloss = (ei{j,2} - minei)/minei*100;
    if pdiffloss > 100
        Mdl = fit(Mdl,X(:,idx),Y(idx),'ObservationsIn','columns');
        trained(j) = true;
    end    
    beta313(j) = Mdl.Beta(end);
end

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

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

subplot(2,1,1)
plot(beta313)
hold on
plot(find(trained),beta313(trained),'r.')
ylabel('\beta_{313}')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
legend('\beta_{313}','Training occurs','Location','southeast')
hold off
subplot(2,1,2)
plot(ei.Variables)
ylabel('Epsilon Insensitive Loss')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(ei.Properties.VariableNames)

Figure contains 2 axes. Axes 1 contains 3 objects of type line, constantline. These objects represent \beta_{313}, Training occurs. Axes 2 contains 3 objects of type line, constantline. These objects represent Cumulative, Window.

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

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

свернуть все

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

Если Mdl.IsWarm является false, updateMetrics не отслеживает эффективность модели. Вы должны подогнать Mdl на Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod наблюдения путем прохождения Mdl и данные для fit прежде updateMetrics может отслеживать метрики эффективности. Для получения дополнительной информации см. «Алгоритмы».

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

Длина меток наблюдений 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 поддерживает только двоичную классификацию.

  • Когда ClassNames свойство модели входа Mdl не пуст, применяются следующие условия:

    • Если Y содержит метку, которая не является представителем Mdl.ClassNames, updateMetrics выдает ошибку.

    • Тип данных Y и Mdl.ClassNames должно быть то же самое.

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

Примечание

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

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'ObservationsIn','columns','Weights',W задает, что столбцы матрицы предиктора соответствуют наблюдениям, и вектор W содержит веса наблюдений, применяемые во время инкрементного обучения.

Размерность наблюдения данных предиктора, заданная как разделенная разделенными запятой парами, состоящая из 'ObservationsIn' и 'columns' или 'rows'.

Типы данных: char | string

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

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

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

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

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

свернуть все

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

Если модель не теплая, 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.

    Если Mdl.EstimationPeriod > 0, функции оценивают гиперпараметры перед подгонкой модели к данным. Поэтому функции должны обрабатывать дополнительное EstimationPeriod наблюдения перед началом модели периода прогрева метрики.

  • The 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 нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений являются соответствующими вероятностями предыдущего класса по умолчанию.

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

Расширенные возможности

.
Введенный в R2020b