exponenta event banner

потеря

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

Описание

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

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

пример

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

пример

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

Примеры

свернуть все

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

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

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

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

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

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

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

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

Mdl = incrementalClassificationNaiveBayes('ClassNames',unique(Y),'MetricsWindowSize',1000);
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
canComputeLoss = (size(Mdl.DistributionParameters,2) == Mdl.NumPredictors) +...
    (size(Mdl.DistributionParameters,1) > 1) > 1
canComputeLoss = logical
   1

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

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

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

  2. Звонить loss для измерения производительности модели на входящем блоке.

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

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

% Preallocation
numObsPerChunk = 500;
nchunk = floor((n - initobs)/numObsPerChunk);
mc = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Loss"]);

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    mc{j,["Cumulative" "Window"]} = Mdl.Metrics{"MinimalCost",:};
    mc{j,"Loss"} = loss(Mdl,X(idx,:),Y(idx));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

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

figure;
plot(mc.Variables);
xlim([0 nchunk]);
ylim([0 0.1])
ylabel('Minimal Cost')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk + 1,'r-.');
legend(mc.Properties.VariableNames)
xlabel('Iteration')

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

Подберите наивную классификационную модель Байеса для инкрементного обучения потоковой передаче данных и вычислите многоклассовые потери перекрестной энтропии для входящих порций данных.

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

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

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

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

  • Укажите имена классов

  • Укажите период прогрева метрик, равный 1000 наблюдениям.

  • Укажите размер окна метрик 2000 наблюдений.

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

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

tolerance = 1e-10;
crossentropy = @(z,zfit,w,cost)-log(max(zfit(z),tolerance));
ce = struct("CrossEntropy",crossentropy);

Mdl = incrementalClassificationNaiveBayes('ClassNames',unique(Y),'MetricsWarmupPeriod',1000,...
    'MetricsWindowSize',2000,'Metrics',ce);
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

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

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

  • Моделирование потока данных путем обработки части из 100 наблюдений.

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

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

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

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

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
tanloss = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Chunk"]);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    tanloss{j,1:2} = Mdl.Metrics{"CrossEntropy",:};
    tanloss{j,3} = loss(Mdl,X(idx,:),Y(idx),'LossFun',@(z,zfit,w,cost)mean(crossentropy(z,zfit,w,cost)));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

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

figure;
h = plot(tanloss.Variables);
ylabel('Cross Entropy')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(h,tanloss.Properties.VariableNames)

Сюжет предполагает следующее:

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

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

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

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

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

свернуть все

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

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

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

  • В противном случае необходимо подогнать входную модель Mdl к данным, которые содержали все ожидаемые классы (Mdl.DistributionParameters должен быть матрицей ячейки с Mdl.NumPredictors столбцы и по крайней мере одна строка, где каждая строка соответствует каждому имени класса в Mdl.ClassNames).

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

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

Примечание

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

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

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

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

  • Когда 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.

Пример: 'LossFun','classiferror','Weights',W определяет частоту ошибок при классификации и весовые коэффициенты наблюдения W.

Функция потери, заданная как имя встроенной функции потери или дескриптор функции.

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

ИмяОписание
"binodeviance"Биномиальное отклонение
"classiferror"Частота ошибок классификации
"exponential"Показательный
"hinge"Стержень
"logit"Логистический
'"mincost"

Минимальная ожидаемая стоимость классификации ошибок

"quadratic"Квадратный

Дополнительные сведения см. в разделе Потеря классификации.

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

lossval = lossfcn(C,S,W,Cost)

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

  • Указывается имя функции (lossfcn).

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

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

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

  • Cost является цифровой матрицей K-by-K затрат на неправильную классификацию.

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

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

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

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

По умолчанию Weights является ones(n,1).

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

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

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

свернуть все

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

Подробнее

свернуть все

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

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

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

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

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

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

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

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

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

  • Для алгоритмов, поддерживающих мультиклассовую классификацию (то есть K ≥ 3):

    • yj * - вектор из K - 1 нулей, с 1 в положении, соответствующем истинному наблюдаемому классу yj. Например, если истинным классом второго наблюдения является третий класс и K = 4, то y2 * = [0 0 1 0] ′. Порядок классов соответствует порядку в ClassNames свойства входной модели.

    • f (Xj) - вектор длины K оценок класса для наблюдения j данных предсказателя X. Порядок оценок соответствует порядку классов в ClassNames свойства входной модели.

    • mj = yj * f (Xj). Поэтому mj - это скалярная оценка классификации, которую модель прогнозирует для истинного наблюдаемого класса.

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

    ∑j=1nwj=1.

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

Функция потерьЗначение LossFunУравнение
Биномиальное отклонение'binodeviance'L=∑j=1nwjlog{1+exp[−2mj]}.
Неверно классифицированная скорость в десятичной'classiferror'

L=∑j=1nwjI{y^j≠yj}.

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

Потери перекрестной энтропии'crossentropy'

'crossentropy' подходит только для моделей нейронных сетей.

Взвешенная потеря перекрестной энтропии равна

L=−∑j=1nw˜jlog (mj) Kn,

где веса w˜j нормализуются для суммирования в n вместо 1.

Экспоненциальные потери'exponential'L=∑j=1nwjexp (мдж).
Потеря шарнира'hinge'L=∑j=1nwjmax{0,1−mj}.
Потеря журнала'logit'L=∑j=1nwjlog (1 + exp (mj)).
Минимальная ожидаемая стоимость классификации ошибок'mincost'

'mincost' подходит только в том случае, если классификационные оценки являются задними вероятностями.

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

  1. Оценить ожидаемую стоимость неправильной классификации для классификации наблюдения Xj в класс k:

    γ jk = (f (Xj) C) k.

    f (Xj) - вектор-столбец апостериорных вероятностей класса для двоичной и мультиклассовой классификации для наблюдения Xj. C - матрица затрат, сохраненная в Cost свойство модели.

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

    y ^ j = аргминк = 1,..., Kγ jk.

  3. Используя C, определите затраты, понесенные (cj) для составления прогноза.

Средневзвешенное минимальное ожидаемое снижение затрат на неправильную классификацию

L=∑j=1nwjcj.

Если используется матрица затрат по умолчанию (значение элемента которой равно 0 для правильной классификации и 1 для неправильной классификации), то 'mincost' убыток эквивалентен 'classiferror' потери.

Квадратичные потери'quadratic'L=∑j=1nwj (1 mj) 2.

На этом рисунке сравниваются функции потерь (за исключением 'crossentropy' и 'mincost') над баллом м для одного наблюдения. Некоторые функции нормализуются для прохождения через точку (0,1).

Comparison of classification losses for different loss functions

Алгоритмы

свернуть все

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

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

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

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

Представлен в R2021a