loss

Потеря линейной модели для инкрементного обучения на пакете данных

Описание

loss возвращает регрессию или потерю классификации сконфигурированной модели инкрементного обучения для линейной регрессии (incrementalRegressionLinear объект) или линейная двоичная классификация (incrementalClassificationLinear объект).

Чтобы измерить производительность модели в потоке данных и сохранить результаты в модели выхода, вызовите updateMetrics или updateMetricsAndFit.

пример

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

пример

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

Примеры

свернуть все

Эффективность инкрементальной модели на потоковых данных измеряется тремя способами:

  1. Кумулятивные метрики измеряют эффективность с начала инкрементного обучения.

  2. Метрики окна измеряют эффективность в заданном окне наблюдений. Метрики обновляются каждый раз, когда модель обрабатывает указанное окно.

  3. The loss функция измеряет эффективность только для заданного пакета данных.

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

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;

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

p = size(X,2);
Beta = randn(p,1);
Bias = randn(1);
Mdl = incrementalClassificationLinear('Beta',Beta,'Bias',Bias,...
    'ClassNames',unique(Y),'Prior','uniform','MetricsWindowSize',1000);

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

  • Обучите модель SVM с помощью fitcsvm или fitclinear на подмножестве данных (при наличии), а затем преобразуйте модель в пошагового ученика при помощи incrementalLearner.

  • Пошагово подгоняемые Mdl к данным при помощи fit.

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

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

  2. Функции loss для измерения производительности модели на входящем фрагменте.

  3. Функции fit для подгонки модели к входящему фрагменту. Перезаписать предыдущую инкрементальную модель на новую, подобранную входящему наблюдению.

  4. Сохраните все метрики эффективности, чтобы увидеть, как они развиваются во время инкрементного обучения.

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

% 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));
    ce{j,["Cumulative" "Window"]} = Mdl.Metrics{"ClassificationError",:};
    ce{j,"Loss"} = loss(Mdl,X(idx,:),Y(idx));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

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

figure;
plot(ce.Variables);
xlim([0 nchunk]);
ylim([0 0.05])
ylabel('Classification Error')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(ce.Properties.VariableNames)
xlabel('Iteration')

Figure contains an axes. The axes contains 4 objects of type line, constantline. These objects represent Cumulative, Window, Loss.

В течение периода прогрева метрики (область слева от красной линии) желтая линия представляет ошибку классификации для каждого входящего фрагмента данных. После периода прогрева метрики Mdl отслеживает совокупные и оконные метрики. Совокупные и пакетные потери сходятся как fit функция подходит для инкрементальной модели к входящим данным.

Подбор модели инкрементного обучения для регрессии к потоковым данным и вычисление среднего абсолютного отклонения (MAD) во входящих пакетах данных.

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

load robotarm
n = numel(ytrain);
p = size(Xtrain,2);

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

Создайте инкрементальную линейную модель для регрессии. Сконфигурируйте модель следующим образом:

  • Задайте период прогрева метрики 1000 наблюдений.

  • Задайте размер окна метрики 500 наблюдений.

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

  • Сконфигурируйте модель, чтобы предсказать ответы, указав, что все коэффициенты регрессии и смещение равны 0.

maefcn = @(z,zfit,w)(abs(z - zfit));
maemetric = struct("MeanAbsoluteError",maefcn);

Mdl = incrementalRegressionLinear('MetricsWarmupPeriod',1000,'MetricsWindowSize',500,...
    'Metrics',maemetric,'Beta',zeros(p,1),'Bias',0,'EstimationPeriod',0)
Mdl = 
  incrementalRegressionLinear

               IsWarm: 0
              Metrics: [2x2 table]
    ResponseTransform: 'none'
                 Beta: [32x1 double]
                 Bias: 0
              Learner: 'svm'


  Properties, Methods

Mdl является incrementalRegressionLinear объект модели, сконфигурированный для инкрементного обучения.

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

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

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

  • Функции loss для вычисления MAD на входящем фрагменты данных. В то время как совокупная и оконная метрики требуют, чтобы пользовательские потери возвращали потери для каждого наблюдения, loss требуется потеря всего фрагмента. Вычислите среднее значение абсолютного отклонения.

  • Функции fit для подгонки инкрементальной модели к входящему фрагменту данных.

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

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
mae = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Chunk"]);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = updateMetrics(Mdl,Xtrain(idx,:),ytrain(idx));
    mae{j,1:2} = Mdl.Metrics{"MeanAbsoluteError",:};
    mae{j,3} = loss(Mdl,Xtrain(idx,:),ytrain(idx),'LossFun',@(x,y,w)mean(maefcn(x,y,w)));
    Mdl = fit(Mdl,Xtrain(idx,:),ytrain(idx));
end

IncrementalMdl является incrementalRegressionLinear объект модели обучен на всех данных в потоке. Во время инкрементного обучения и после прогрева модели updateMetrics проверяет эффективность модели при входящем наблюдении и fit функция соответствует модели этому наблюдению.

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

figure;
h = plot(mae.Variables);
ylabel('Mean Absolute Deviation')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(h,mae.Properties.VariableNames)

Figure contains an axes. The axes contains 4 objects of type line, constantline. These objects represent Cumulative, Window, Chunk.

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

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

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

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

  • Потому что Mdl был сконфигурирован так, чтобы предсказывать наблюдения с начала инкрементного обучения, loss можно вычислить MAD для каждого входящего фрагмента данных.

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

свернуть все

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

Необходимо сконфигурировать Mdl вычислить его потери по пакету наблюдений.

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

  • В противном случае Mdl должен удовлетворять следующим критериям, которые можно задать непосредственно или путем подгонки Mdl к данным с помощью fit или updateMetricsAndFit.

    • Если Mdl является incrementalRegressionLinear модель, ее коэффициенты модели Mdl.Beta и смещение Mdl.Bias не должны быть пустыми массивами.

    • Если Mdl является incrementalClassificationLinear модель, ее коэффициенты модели Mdl.Beta и смещение Mdl.Bias должны быть непустыми массивами, именами классов Mdl.ClassNames должен содержать два класса и предшествующее распределение классов Mdl.Prior должны содержать известные значения.

    • Независимо от типа объекта, если вы конфигурируете модель так, эти функции стандартизировали данные предиктора, предиктор означает Mdl.Mu и стандартные отклонения Mdl.Sigma не должны быть пустыми массивами.

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

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

Примечание

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

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

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

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

Для задач классификации:

  • loss поддерживает только двоичную классификацию.

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

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

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

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

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

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

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

Функция потерь, заданная как разделенная разделенными запятой парами, состоящая из 'LossFun' и встроенное имя функции потери или указатель на функцию.

  • Задачи классификации: В следующей таблице перечислены доступные функции потерь при Mdl является incrementalClassificationLinear модель. Задайте один с помощью соответствующего вектора символов или строкового скаляра.

    ИмяОписание
    "binodeviance"Биномиальное отклонение
    "classiferror" (по умолчанию)Коэффициент неправильной классификации в десятичных числах
    "exponential"Экспоненциальные потери
    "hinge"Потеря шарнира
    "logit"Логистические потери
    "quadratic"Квадратичные потери

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

    Учащиеся логистической регрессии возвращают апостериорные вероятности как классификационные оценки, но ученики SVM этого не делают (см. predict).

    Чтобы задать пользовательскую функцию потерь, используйте обозначение указателя на функцию. Функция должна иметь следующую форму:

    lossval = lossfcn(C,S,W)

    • Выходной аргумент lossval - вектор с n -by-1 с плавающей точкой, где lossval (j) классификационная потеря наблюдений j.

    • Вы задаете имя функции (lossfcn).

    • C является n -by-2 логической матрицей с строками, указывающими класс, к которому принадлежит соответствующее наблюдение. Порядок столбцов соответствует порядку классов в ClassNames свойство. Создание C путем установки C (p, q) = 1, если наблюдение p находится в q классов, для каждого наблюдения в заданных данных. Установите другой элемент в строку p на 0.

    • S является n -by-2 числовой матрицей предсказанных классификационных оценок. S аналогичен score выхода predict, где строки соответствуют наблюдениям в данных, а порядок столбцов соответствует порядку классов в ClassNames свойство. S (p, q) - классификационная оценка наблюдения p классифицируется в классах q.

    • W является n -by-1 числовым вектором весов наблюдений.

  • Регрессионные задачи: В следующей таблице перечислены доступные функции потерь при Mdl является incrementalRegressionLinear модель. Задайте один с помощью соответствующего вектора символов или строкового скаляра.

    ИмяОписаниеУчащиеся, поддерживающие метрику
    "epsiloninsensitive"Эпсилоновые нечувствительные потери'svm'
    "mse" (по умолчанию)Средневзвешенная квадратичная невязка'svm' и 'leastsquares'

    Для получения дополнительной информации смотрите Регрессионные потери.

    Чтобы задать пользовательскую функцию потерь, используйте обозначение указателя на функцию. Функция должна иметь следующую форму:

    lossval = lossfcn(Y,YFit,W)

    • Выходной аргумент lossval является скаляром с плавающей точкой.

    • Вы задаете имя функции (lossfcn).

    • Y является длинным n числовым вектором наблюдаемых откликов.

    • YFit является длинным n числовым вектором соответствующих предсказанных откликов.

    • W является n -by-1 числовым вектором весов наблюдений.

Пример: 'LossFun',"mse"

Пример: 'LossFun', @ lossfcn

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

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

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

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

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

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

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

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

свернуть все

Классификация или регрессионные потери, возвращенные как числовой скаляр. Толкование L зависит от Weights и LossFun.

Подробнее о

свернуть все

Классификационные потери

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

Рассмотрим следующий сценарий.

  • L - средневзвешенные классификационные потери.

  • n - размер выборки.

  • Для двоичной классификации:

    • yj - наблюдаемая метка класса. Программное обеспечение кодирует его как -1 или 1, указывая на отрицательный или положительный класс (или первый или второй класс в ClassNames свойство), соответственно.

    • f (Xj) является баллом классификации положительного класса для j наблюдений (строка) X данных предиктора.

    • mj = yj f (Xj) является классификационной оценкой для классификации j наблюдений в класс, относящийся к yj. Положительные значения mj указывают на правильную классификацию и не вносят большой вклад в средние потери. Отрицательные значения mj указывают на неправильную классификацию и вносят значительный вклад в среднюю потерю.

  • Вес для j наблюдения wj.

С учетом этого сценария в следующей таблице описываются поддерживаемые функции потерь, которые можно задать при помощи 'LossFun' аргумент пары "имя-значение".

Функция потерьЗначение LossFunУравнение
Биномиальное отклонение"binodeviance"L=j=1nwjlog{1+exp[2mj]}.
Экспоненциальные потери"exponential"L=j=1nwjexp(mj).
Коэффициент неправильной классификации в десятичных числах"classiferror"

L=j=1nwjI{y^jyj}.

y^j - метка класса, соответствующая классу с максимальным счетом. I {·} является функцией индикации.

Потеря шарнира"hinge"L=j=1nwjmax{0,1mj}.
Логит потеря"logit"L=j=1nwjlog(1+exp(mj)).
Квадратичные потери"quadratic"L=j=1nwj(1mj)2.

Этот рисунок сравнивает функции потерь по сравнению с счетом m для одного наблюдения. Некоторые функции нормированы, чтобы пройти через точку (0,1).

Comparison of classification losses for different loss functions

Регрессионные потери

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

Рассмотрим следующий сценарий.

  • L - средневзвешенные классификационные потери.

  • n - размер выборки.

  • yj - наблюдаемая реакция j наблюдений.

  • f (Xj) = β 0 + xj β является предсказанным значением j наблюдений X данных предиктора, где β 0 является смещением, а β является вектором коэффициентов.

  • Вес для j наблюдения wj.

С учетом этого сценария в следующей таблице описываются поддерживаемые функции потерь, которые можно задать при помощи 'LossFun' аргумент пары "имя-значение".

Функция потерьЗначение LossFunУравнение
Эпсилоновые нечувствительные потери"epsiloninsensitive"

L=max[0,|yf(x)|ε].

Средняя квадратичная невязка"mse"

L=[yf(x)]2.

Алгоритмы

свернуть все

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

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

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

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

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