updateMetricsAndFit

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

Описание

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

    1. Инициализируйте решатель с коэффициентом строений и линейной модели и оценками смещения входа модели Mdl.

    2. Подгонка модели к данным и хранение обновленных оценок и строений коэффициентов в модели выхода Mdl.

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

пример

Mdl = updateMetricsAndFit(Mdl,X,Y,Name,Value) использует дополнительные опции, заданные одним или несколькими аргументами пары "имя-значение". Например, можно задать, что столбцы матрицы данных предиктора соответствуют наблюдениям, и задать веса наблюдений.

Примеры

свернуть все

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

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 наблюдений.

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

  • Магазин β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 = updateMetricsAndFit(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    beta1(j + 1) = Mdl.Beta(1);
end

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

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

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

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.

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

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

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

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

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

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

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

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

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

Предположим, что данные, собранные с Манхэттена (BOROUGH = 1) был собран с помощью нового метода, который удваивает его качество. Создайте весовую переменную, которая приписывает 2 наблюдениям, собранным с Манхэттена, и 1 всем остальным наблюдениям.

n = size(NYCHousing2015,1);
NYCHousing2015.W = ones(n,1) + (NYCHousing2015.BOROUGH == 1);

Извлеките переменную отклика 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}]';

Обучите линейную регрессионую модель

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

idxtt = randsample([true false],n,true);
TTMdl = fitrlinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns',...
    'Weights',NYCHousing2015.W(idxtt))
TTMdl = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1116
               Lambda: 2.1977e-05
              Learner: 'svm'


  Properties, Methods

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

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalRegressionLinear

               IsWarm: 1
              Metrics: [1x2 table]
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1116
              Learner: 'svm'


  Properties, Methods

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

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

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

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

  3. Сохраните потери и последний оцененный коэффициент β313.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 500;
nchunk = floor(nil/numObsPerChunk);
ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta313 = [IncrementalMdl.Beta(end); zeros(nchunk,1)];
Xil = X(:,idxil);
Yil = Y(idxil);
Wil = NYCHousing2015.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),...
        'ObservationsIn','columns','Weights',Wil(idx));
    ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:};
    beta313(j + 1) = IncrementalMdl.Beta(end);
end

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

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

figure;
subplot(2,1,1)
h = plot(ei.Variables);
xlim([0 nchunk]);
ylabel('Epsilon Insensitive Loss')
legend(h,ei.Properties.VariableNames)
subplot(2,1,2)
plot(beta313)
ylabel('\beta_{313}')
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.

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

β313 изменяется, но быстро выключается, как fit обрабатывает фрагменты наблюдений.

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

свернуть все

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

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

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

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

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

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

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

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

Примечание

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

  • Размер фрагмента n и стохастический градиентный спуск (SGD) гиперпараметра размер пакета (Mdl.BatchSize) могут быть различными значениями. Если n < Mdl.BatchSize, updateMetricsAndFit использует n доступные наблюдения при применении SGD.

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

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

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

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

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

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

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

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

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

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

свернуть все

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

Когда вы звоните updateMetricsAndFit, применяются следующие условия:

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

  • Если Mdl.EstimationPeriod > 0, updateMetricsAndFit оценивает гиперпараметры, используя первую Mdl.EstimationPeriod к нему перешли наблюдения; функция не обучает модель входа, используя эти данные. Однако, если входящий фрагмент n наблюдений больше или равен количеству наблюдений, остающихся в m периода оценки, updateMetricsAndFit оценивает гиперпараметры, используя первые n - m наблюдения, и подгоняет входную модель к остальным m наблюдениям. Следовательно, программное обеспечение обновляет Beta и Bias свойства, свойства гиперпараметра и свойства записи, такие как NumTrainingObservations.

Для задач классификации, если ClassNames свойство модели входа Mdl - пустой массив, updateMetricsAndFit устанавливает ClassNames свойство модели выхода Mdl на unique(Y).

Алгоритмы

свернуть все

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

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

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

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

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

Ссылки

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

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

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