Обновляйте метрики эффективности в наивной модели классификации Байеса для инкрементного обучения с учетом новых данных
Данные потоковой передачи, updateMetrics
измеряет эффективность сконфигурированной наивной классификационной модели Байеса для инкрементного обучения (incrementalClassificationNaiveBayes
объект). updateMetrics
сохраняет метрики эффективности в модели выхода.
updateMetrics
позволяет проводить гибкое инкрементальное обучение. После вызова функции для обновления показателей производительности модели на входящем фрагменте данных можно выполнить другие действия, прежде чем обучать модель данным. Например, можно решить, нужно ли обучать модель на основе ее эффективности на фрагменте данных. Кроме того, можно как обновить метрики производительности модели, так и обучить модель на данных по мере их поступления, за один вызов, используя updateMetricsAndFit
функция.
Чтобы измерить производительность модели для заданного пакета данных, вызовите loss
вместо этого.
возвращает наивную модель классификации Байеса для инкрементного обучения Mdl
= updateMetrics(Mdl
,X
,Y
)Mdl
, которая является входной наивной моделью классификации Байеса для инкрементного обучения Mdl
изменено, чтобы содержать метрики производительности модели на входящих данных предиктора и отклика, X
и Y
соответственно.
Когда модель входа warm (Mdl.IsWarm
является true
), updateMetrics
перезаписывает ранее вычисленные метрики, хранящиеся в Metrics
свойство с новыми значениями. В противном случае, updateMetrics
хранит NaN
значения в Metrics
вместо этого.
Входная и выходная модели имеют совпадающий тип данных.
Обучите наивную модель классификации Байеса с помощью fitcnb
преобразуйте его в пошагового ученика, а затем отслеживайте его эффективность в потоковые данные.
Загрузка и предварительная обработка данных
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity rng(1); % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Обучите наивную модель классификации Байеса
Подгонка наивной модели классификации Байеса к случайной выборке из половины данных.
idxtt = randsample([true false],n,true); TTMdl = fitcnb(X(idxtt,:),Y(idxtt))
TTMdl = ClassificationNaiveBayes ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' NumObservations: 12053 DistributionNames: {1×60 cell} DistributionParameters: {5×60 cell} Properties, Methods
TTMdl
является ClassificationNaiveBayes
объект модели, представляющий традиционно обученную модель.
Преобразуйте обученную модель
Преобразуйте традиционно обученную классификационную модель в наивную классификационную модель Байеса для инкрементного обучения.
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationNaiveBayes IsWarm: 1 Metrics: [1×2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' DistributionNames: {1×60 cell} DistributionParameters: {5×60 cell} Properties, Methods
Инкрементальная модель теплая. Поэтому updateMetrics
может отслеживать данные о метриках производительности модели.
Отслеживайте метрики эффективности
Отслеживайте производительность модели по остальным данным при помощи updateMetrics
функция. Симулируйте поток данных путем обработки 50 наблюдений за раз. При каждой итерации:
Функции updateMetrics
обновить совокупную и оконную минимальную стоимость модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics
свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели.
Сохраните минимальные затраты и среднее значение первого предиктора в первом классе .
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); mu11 = [IncrementalMdl.DistributionParameters{1,1}(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)); mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:}; mu11(j + 1) = IncrementalMdl.DistributionParameters{1,1}(1); end
IncrementalMdl
является incrementalClassificationNaiveBayes
объект модели, который отслеживал производительность модели до наблюдений в потоке данных.
Постройте график трассировки метрик эффективности и оценочного коэффициента .
figure; subplot(2,1,1) h = plot(mc.Variables); xlim([0 nchunk]); ylabel('Minimal Cost') legend(h,mc.Properties.VariableNames) subplot(2,1,2) plot(mu11) ylabel('\mu_{11}') xlim([0 nchunk]); xlabel('Iteration')
Совокупные потери стабильны, в то время как потери окна скачут.
не меняется, потому что updateMetrics
не соответствует модели данным.
Создайте наивную модель классификации Байеса для инкрементного обучения путем вызова incrementalClassificationNaiveBayes
и указание в данных не более 5 ожидаемых классов. Укажите ошибочную классификацию ошибки отслеживания в сложении с минимальными затратами.
Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'Metrics',"classiferror");
Mdl
является incrementalClassificationNaiveBayes
модель. Все его свойства доступны только для чтения.
Определите, является ли модель теплой, и размер периода прогрева метрики, запросив свойства модели.
isWarm = Mdl.IsWarm
isWarm = logical
0
mwp = Mdl.MetricsWarmupPeriod
mwp = 1000
Mdl.IsWarm
является 0;
поэтому Mdl
не тепло.
Определите количество инкрементных функций аппроксимации наблюдений, таких как fit
, необходимо обработать перед измерением эффективности модели.
numObsBeforeMetrics = Mdl.MetricsWarmupPeriod
numObsBeforeMetrics = 1000
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Предположим, что данные, собранные, когда субъект не двигался (Y
< = 2) имеет удвоенное качество, чем при движении субъекта. Создайте весовую переменную, которая атрибутирует 2 наблюдениям, собранным от неподвижного субъекта, и 1 - движущемуся субъекту.
W = ones(n,1) + ~Y;
Реализуйте инкрементальное обучение путем выполнения следующих действий при каждой итерации:
Симулируйте поток данных путем обработки фрагмента 50 наблюдений.
Измерьте метрики производительности модели на входящем фрагменте с помощью updateMetrics
. Задайте соответствующие веса наблюдений и перезаписайте модель входа.
Подбор модели к входящему фрагменту. Задайте соответствующие веса наблюдений и перезаписайте модель входа.
Магазин и вероятность ошибки неправильной классификации, чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); mu11 = zeros(nchunk,1); % 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),'Weights',W(idx)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; Mdl = fit(Mdl,X(idx,:),Y(idx),'Weights',W(idx)); mu11(j) = Mdl.DistributionParameters{1,1}(1); end
IncrementalMdl
является incrementalClassificationNaiveBayes
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как параметры развивались во время инкрементного обучения, постройте их на отдельных подграфиках.
figure; subplot(2,1,1) plot(mu11) ylabel('\mu_{11}') xlabel('Iteration') axis tight subplot(2,1,2) plot(ce.Variables); ylabel('ClassificationError') xline(numObsBeforeMetrics/numObsPerChunk,'r-.'); xlabel('Iteration') xlim([0 nchunk]); legend(ce.Properties.VariableNames)
mdlIsWarm = numObsBeforeMetrics/numObsPerChunk
mdlIsWarm = 20
График предполагает, что fit
всегда подходит модель к данным, и updateMetrics
не отслеживает ошибку классификации до окончания периода прогрева метрики (20 фрагменты).
Пошагово обучайте наивную модель классификации Байеса, только когда ее эффективность ухудшается.
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Сконфигурируйте наивную модель классификации Байеса для инкрементного обучения так, чтобы максимальное количество ожидаемых классов было 5, отслеживаемая метрика эффективности включает ошибочную частоту ошибок классификации и размер окна метрики 1000. Подгонка сконфигурированной модели к первым 1000 наблюдениям.
Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWindowSize',1000,... 'Metrics','classiferror'); initobs = 1000; Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
Mdl
является incrementalClassificationNaiveBayes
объект модели.
Выполните инкрементальное обучение с условным подбором кривой, выполнив эту процедуру для каждой итерации:
Симулируйте поток данных путем обработки фрагмента 100 наблюдений за раз.
Обновите производительность модели на входящем фрагменты данных.
Подгонка модели к фрагменту данных только тогда, когда вероятность ошибки неправильной классификации больше 0,05.
При отслеживании эффективности и подбора кривой перезаписайте предыдущую инкрементную модель.
Сохраните вероятность ошибки неправильной классификации и среднее значение первого предиктора во втором классе чтобы увидеть, как они развиваются во время обучения.
Отследите, когда fit
обучает модель.
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); mu21 = zeros(nchunk,1); ce = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]); trained = false(nchunk,1); % 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)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; if ce{j,2} > 0.05 Mdl = fit(Mdl,X(idx,:),Y(idx)); trained(j) = true; end mu21(j) = Mdl.DistributionParameters{2,1}(1); end
Mdl
является incrementalClassificationNaiveBayes
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как производительность модели и развивался во время обучения, строил их на отдельных подграфиках.
subplot(2,1,1) plot(mu21) hold on plot(find(trained),mu21(trained),'r.') ylabel('\mu_{21}') legend('\mu_{21}','Training occurs','Location','best') hold off subplot(2,1,2) plot(ce.Variables) ylabel('Misclassification Error Rate') xlabel('Iteration') legend(ce.Properties.VariableNames,'Location','best')
График трассировки показывает периоды постоянных значений, в течение которых потеря в предыдущем окне наблюдения 1000 составляет самое большее 0,05.
Mdl
- Модель инкрементного обучения, эффективность которой измеряетсяincrementalClassificationNaiveBayes
объект моделиМодель инкрементного обучения, эффективность которой измеряется, задается как incrementalClassificationNaiveBayes
объект модели. Можно создавать Mdl
непосредственно или путем преобразования поддерживаемой, традиционно обученной модели машинного обучения с помощью incrementalLearner
функция. Для получения дополнительной информации см. соответствующую страницу с описанием.
Если Mdl.IsWarm
является false
, updateMetrics
не отслеживает эффективность модели. Прежде updateMetrics
можно отслеживать показатели эффективности, необходимо выполнить все следующие действия:
Подбор модели входа Mdl
ко всем ожидаемым классам (см MaxNumClasses
и ClassNames
аргументы incrementalClassificationNaiveBayes
)
Подбор модели входа Mdl
на Mdl.MetricsWarmupPeriod
наблюдения путем прохождения Mdl
и данные для fit
. Для получения дополнительной информации см. «Показатели эффективности».
X
- Фрагмент данных предиктораФрагмент данных предиктора, с помощью которого можно измерить производительность модели
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в (j
)X
.
Примечание
Если Mdl.NumPredictors
= 0, updateMetrics
выводит количество предикторов из X
, и устанавливает свойство congruent модели выхода. В противном случае, если количество переменных предиктора в потоковых данных изменяется с Mdl.NumPredictors
, updateMetrics
выдает ошибку.
updateMetrics
поддерживает только входные данные предиктора с плавающей точкой. Если модель входа Mdl
представляет собой преобразованную, традиционно обученную модель, подходящую для категориальных данных, использование dummyvar
чтобы преобразовать каждую категориальную переменную в числовую матрицу фиктивных переменных и объединить все фиктивные переменные матрицы и любые другие числовые предикторы. Для получения дополнительной информации см. Dummy Переменных.
Типы данных: single
| double
Y
- Фрагмент метокФрагмент меток, которым можно измерить производительность модели, заданный как категориальные символьные или строковые массивы, логический вектор или вектор с плавающей точкой или массив ячеек из векторов символов.
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в (j
)X
. updateMetrics
выдает ошибку, когда достигается по крайней мере одно из условий:
Y
содержит вновь встречающуюся метку, и максимальное количество классов было достигнуто ранее (см MaxNumClasses
и ClassNames
аргументы incrementalClassificationNaiveBayes
).
Типы данных Y
и Mdl.ClassNames
разные.
Типы данных: char
| string
| cell
| categorical
| logical
| single
| double
Weights
- Фрагмент весов наблюденийФрагмент весов наблюдений, заданный как вектор с плавающей точкой положительных значений. updateMetrics
взвешивает наблюдения в X
с соответствующими значениями в Weights
. Размер Weights
должен равняться n, это количество наблюдений в X
.
По умолчанию Weights
это таковые
.(n
,1)
Для получения дополнительной информации, включая схемы нормализации, см. «Веса наблюдений».
Типы данных: double
| single
Примечание
Если наблюдение (предиктор или метка) или вес Weight
содержит по крайней мере один отсутствующий (NaN
) значение, updateMetrics
игнорирует наблюдение. Следовательно, updateMetrics
использует меньше n наблюдений для вычисления производительности модели.
Mdl
- Обновленная наивная классификационная модель Байеса для инкрементного обученияincrementalClassificationNaiveBayes
объект моделиОбновленная наивная модель классификации Байеса для инкрементного обучения, возвращенная как объект модели инкрементного обучения совпадающего типа данных, что и входная модель Mdl
, an incrementalClassificationNaiveBayes
объект.
Если модель не теплая, updateMetrics
не вычисляет показатели эффективности. В результате этого Metrics
свойство Mdl
остатки полностью состоят из NaN
значения. Если модель теплая, updateMetrics
вычисляет совокупные и оконные метрики эффективности на новых данных X
и Y
, и перезаписывает соответствующие элементы Mdl.Metrics
. Все другие свойства модели входа Mdl
перенос в модель выхода Mdl
. Для получения дополнительной информации см. «Показатели эффективности».
В отличие от традиционного обучения, инкрементальное обучение может не иметь отдельного теста (holdout) набора. Поэтому, чтобы обработать каждый входящий фрагмент данных как тестовый набор, передайте инкрементальную модель и каждый входящий фрагмент updateMetrics
перед обучением модели на тех же данных используя fit
.
updateMetrics
отслеживает только метрики производительности модели, заданные метками строк таблицы в Mdl.Metrics
, из новых данных, когда инкрементальная модель warm (IsWarm
свойство true
). Инкрементальная модель тепла, когда fit
функция выполняет оба из следующих действий:
Подгонка инкрементной модели к Mdl.MetricsWarmupPeriod
наблюдения, что является metrics warm-up period.
Подгонка инкрементной модели ко всем ожидаемым классам (см MaxNumClasses
и ClassNames
аргументы incrementalClassificationNaiveBayes
)
Mdl.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)
).
Инкрементальные функции, которые отслеживают метрики эффективности в окне, используют следующий процесс:
Для каждой заданной метрики сохраните буфер длины Mdl.MetricsWindowSize
и буфер весов наблюдений.
Заполните элементы буфера метриков производительностью модели на основе пакетов входящих наблюдений и сохраните соответствующие веса наблюдений в буфере весов.
Когда буфер будет заполнен, перезаписайте Mdl.Metrics.Window
со средневзвешенной эффективностью в окне метрики. Если буфер переполнен, когда функция обрабатывает пакет наблюдений, последний входящий Mdl.MetricsWindowSize
наблюдения заходят в буфер, и самые ранние наблюдения удаляются из буфера. Например, предположим Mdl.MetricsWindowSize
20, буфер метрики имеет 10 значений из ранее обработанного пакета и 15 значений являются входящими. Чтобы составить окно длины 20, функция использует измерения из 15 входящих наблюдений и последние 5 измерений из предыдущей партии.
Для каждого условного распределения предиктора, updateMetrics
вычисляет взвешенные средние значения и стандартное отклонение.
Если известное распределение вероятностей классов (другими словами, предшествующее распределение не эмпирическое), updateMetrics
нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений по умолчанию являются соответствующими вероятностями предыдущего класса.
Если распределение вероятностей предыдущего класса эмпирическое, программное обеспечение нормализует указанные веса наблюдений до суммы 1 каждый раз, когда вы вызываете updateMetrics
.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.