exponenta event banner

updateMetrics

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

Описание

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

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

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

пример

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

При теплой входной модели (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 порций).

Пошаговое обучение модели линейной регрессии только при снижении ее производительности.

Загрузка и перетасовка набора данных по жилью в Нью-Йорке 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 наблюдений.

  • Обновите производительность модели путем вычисления нечувствительных потерь epsilon в пределах окна наблюдения 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и устанавливает конгруэнтное свойство выходной модели. В противном случае, если число переменных предиктора в потоковых данных изменяется с Mdl.NumPredictors, updateMetrics выдает ошибку.

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

Типы данных: 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 является ones(n,1).

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

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

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

свернуть все

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

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

Совет

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

Алгоритмы

свернуть все

Показатели производительности

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

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

  • 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