Обновление показателей производительности в наивной модели классификации Байеса для инкрементного обучения с учетом новых данных
Данные потоковой передачи, updateMetrics измеряет производительность настроенной наивной модели классификации Байеса для инкрементного обучения (incrementalClassificationNaiveBayes объект). updateMetrics сохраняет метрики производительности в выходной модели.
updateMetrics обеспечивает гибкое инкрементное обучение. После вызова функции обновления метрик производительности модели для входящего блока данных можно выполнить другие действия перед обучением модели данным. Например, можно решить, нужно ли обучать модель, основываясь на ее производительности на фрагменте данных. Кроме того, можно как обновить метрики производительности модели, так и обучить модель данным по мере их поступления за один вызов с помощью updateMetricsAndFit функция.
Чтобы измерить производительность модели для указанного пакета данных, вызовите loss вместо этого.
возвращает наивную модель классификации Байеса для инкрементного обучения Mdl = updateMetrics(Mdl,X,Y)Mdl, которая является входной наивной моделью классификации Байеса для инкрементного обучения Mdl модифицированный, чтобы содержать метрики производительности модели на входящем предикторе и данные ответа, X и Y соответственно.
При теплой входной модели (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 в командной строке.
Модель классификации Train Naive Bayes
Поместите наивную модель классификации Байеса в случайную выборку из половины данных.
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и устанавливает конгруэнтное свойство выходной модели. В противном случае, если число переменных предиктора в потоковых данных изменяется с Mdl.NumPredictors, updateMetrics выдает ошибку.
updateMetrics поддерживает только входные данные предсказателя с плавающей запятой. Если входная модель Mdl представляет преобразованную, традиционно обученную модель, подходящую для категориальных данных, использование dummyvar преобразовать каждую категориальную переменную в числовую матрицу фиктивных переменных и объединить все фиктивные матрицы переменных и любые другие числовые предикторы. Дополнительные сведения см. в разделе Фиктивные переменные.
Типы данных: 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 является ones(.n,1)
Дополнительные сведения, включая схемы нормализации, см. в разделе Веса наблюдений.
Типы данных: double | single
Примечание
Если наблюдение (предиктор или метка) или вес Weight содержит по крайней мере один отсутствующий (NaN) значение, updateMetrics игнорирует наблюдение. Следовательно, updateMetrics использует менее n наблюдений для вычисления производительности модели.
Mdl - Обновленная наивная модель классификации Байеса для инкрементного обученияincrementalClassificationNaiveBayes объект моделиОбновленная наивная модель классификации Байеса для инкрементного обучения, возвращенная как объект модели инкрементного обучения того же типа данных, что и входная модель Mdlодин incrementalClassificationNaiveBayes объект.
Если модель не теплая, updateMetrics не вычисляет метрики производительности. В результате, Metrics имущество Mdl остается полностью составленным из NaN значения. Если модель теплая, updateMetrics вычисляет кумулятивные и оконные показатели производительности для новых данных X и Yи перезаписывает соответствующие элементы Mdl.Metrics. Все остальные свойства входной модели Mdl перенос в выходную модель Mdl. Дополнительные сведения см. в разделе Показатели производительности.
В отличие от традиционного обучения, инкрементное обучение может не иметь отдельного набора тестов (holdout). Поэтому для обработки каждого входящего блока данных как тестового набора передайте инкрементную модель и каждый входящий блок в updateMetrics перед обучением модели тем же данным с использованием fit.
updateMetrics отслеживает только метрики производительности модели, указанные метриками строк таблицы в Mdl.Metrics, из новых данных, когда инкрементная модель является теплой (IsWarm свойство - true). Инкрементная модель является теплой, когда fit выполняет оба следующих действия:
Подгонка инкрементной модели к Mdl.MetricsWarmupPeriod наблюдения, которые являются периодом прогрева метрик.
Соответствие инкрементной модели всем ожидаемым классам (см. 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.