loss

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

Описание

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 в командной строке.

Создайте наивную модель классификации Бейеса для пошагового обучения; задайте имена классов и метрический размер окна 1 000 наблюдений. Сконфигурируйте его для 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 в командной строке.

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

  • Задайте имена классов

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

  • Задайте метрический размер окна 2 000 наблюдений.

  • Отследите потерю перекрестной энтропии мультикласса, чтобы измерить уровень модели. Создайте анонимную функцию, которая измеряет потерю перекрестной энтропии мультикласса каждого нового наблюдения, включайте допуск к числовой устойчивости. Создайте массив структур, содержащий имя 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.

Типы данных: 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 имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

Стоимость неправильной классификации наблюдения в виде значения в таблице, где c является количеством классов в Mdl.ClassNames. Заданное значение заменяет значение Mdl.Cost.

ЗначениеОписание
c-by-c числовая матрица

Стойте (iJ) стоимость классификации наблюдения в класс j когда его истинным классом является i, для классов Mdl. ClassNames (i) и Mdl. ClassNames (j). Другими словами, строки соответствуют истинному классу, и столбцы соответствуют предсказанному классу. Например, Cost = [0 2;1 0] применяет дважды штраф за неправильную классификацию Mdl.ClassNames(1) чем для неправильной классификации Mdl.ClassNames(2).

Массив структур

Массив структур, имеющий два поля:

  • ClassNames содержа имена классов, то же значение как Mdl.ClassNames

  • ClassificationCosts содержа матрицу стоимости, как ранее описано.

Пример: Cost=struct('ClassNames',Mdl.ClassNames,'ClassificationCosts',[0 2; 1 0])

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

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

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

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

Минимальный ожидал стоимость misclassification

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

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

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

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

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

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

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

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

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

  • Cost K-by-K числовая матрица затрат misclassification.

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

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

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

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

Заданное значение заменяет значение Mdl.Prior.

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

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

Эта таблица описывает доступные встроенные функции для преобразования счета.

ЗначениеОписание
"doublelogit"1/(1 + e–2x)
"invlogit"журнал (x / (1 – x))
"ismax"Устанавливает счет к классу с самым большим счетом к 1 и устанавливает музыку ко всем другим классам к 0
"logit"1/(1 + ex)
"none" или "identity"x (никакое преобразование)
"sign"– 1 для x <0
0 для x = 0
1 для x> 0
"symmetric"2x – 1
"symmetricismax"Устанавливает счет к классу с самым большим счетом к 1 и устанавливает музыку ко всем другим классам к –1
"symmetriclogit"2/(1 + ex) – 1

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

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

По умолчанию, Weights единицы (n,1).

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

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

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

свернуть все

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

Больше о

свернуть все

Потеря классификации

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

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

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

  • n является объемом выборки.

  • Для бинарной классификации:

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

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

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

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

    • yj* вектор из K – 1 нуль, с 1 в положении, соответствующем истинному, наблюдаемому классу yj. Например, если истинный класс второго наблюдения является третьим классом и K = 4, то y 2* = [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^jyj}.

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

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

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

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

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

где веса w˜j нормированы, чтобы суммировать к n вместо 1.

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

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

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

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

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

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

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

    y^j=argmink=1,...,Kγjk.

  3. Используя C, идентифицируйте, что стоимость подверглась (cj) для того, чтобы сделать предсказание.

Взвешенное среднее минимального ожидало, что потеря стоимости misclassification

L=j=1nwjcj.

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

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

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

Comparison of classification losses for different loss functions

Алгоритмы

свернуть все

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

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

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

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

Введенный в R2021a