Обновляйте метрики эффективности в линейной модели для инкрементного обучения с учетом новых данных
Данные потоковой передачи, updateMetrics
измеряет эффективность сконфигурированной модели инкрементного обучения для линейной регрессии (incrementalRegressionLinear
объект) или линейная двоичная классификация (incrementalClassificationLinear
объект). updateMetrics
сохраняет метрики эффективности в модели выхода.
updateMetrics
позволяет проводить гибкое инкрементальное обучение. После вызова функции для обновления показателей производительности модели на входящем фрагменте данных можно выполнить другие действия, прежде чем обучать модель данным. Например, можно решить, нужно ли обучать модель на основе ее эффективности на фрагменте данных. Кроме того, можно как обновить метрики производительности модели, так и обучить модель на данных по мере их поступления, за один вызов, используя updateMetricsAndFit
функция.
Чтобы измерить производительность модели для заданного пакета данных, вызовите loss
вместо этого.
возвращает модель инкрементного обучения Mdl
= updateMetrics(Mdl
,X
,Y
)Mdl
, которая является входом моделью инкрементного обучения Mdl
изменено, чтобы содержать метрики производительности модели на входящих данных предиктора и отклика, X
и Y
соответственно.
Когда модель входа warm (Mdl.IsWarm
является true
), updateMetrics
перезаписывает ранее вычисленные метрики, хранящиеся в Metrics
свойство с новыми значениями. В противном случае, updateMetrics
хранит NaN
значения в Metrics
вместо этого.
Входная и выходная модели имеют совпадающий тип данных.
Обучите линейную модель для двоичной классификации с помощью fitclinear
преобразуйте его в пошагового ученика, а затем отслеживайте его эффективность в потоковые данные.
Загрузка и предварительная обработка данных
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
load humanactivity rng(1); % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Ответы могут быть одним из пяти классов: Сидя, Стоя, Ходьба, Бег, или Танцы. Дихотомизируйте ответ путем определения, движется ли субъект (actid
> 2).
Y = Y > 2;
Обучите линейную модель для двоичной классификации
Подбор линейной модели для двоичной классификации к случайной выборке из половины данных.
idxtt = randsample([true false],n,true); TTMdl = fitclinear(X(idxtt,:),Y(idxtt))
TTMdl = ClassificationLinear ResponseName: 'Y' ClassNames: [0 1] ScoreTransform: 'none' Beta: [60x1 double] Bias: -0.4621 Lambda: 8.2967e-05 Learner: 'svm' Properties, Methods
TTMdl
является ClassificationLinear
объект модели, представляющий традиционно обученную линейную модель для двоичной классификации.
Преобразуйте обученную модель
Преобразуйте традиционно обученную классификационную модель в двоичную классификационную линейную модель для инкрементного обучения.
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationLinear IsWarm: 1 Metrics: [1x2 table] ClassNames: [0 1] ScoreTransform: 'none' Beta: [60x1 double] Bias: -0.4621 Learner: 'svm' Properties, Methods
IncrementalMdl.IsWarm
ans = logical
1
Инкрементальная модель теплая. Поэтому updateMetrics
может отслеживать данные о метриках производительности модели.
Отслеживайте метрики эффективности
Отслеживайте производительность модели по остальным данным при помощи updateMetrics
функция. Симулируйте поток данных путем обработки 50 наблюдений за раз. При каждой итерации:
Функции updateMetrics
обновить совокупную и оконную ошибку классификации модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics
свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели.
Сохраните ошибку классификации и первый коэффициент .
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta1 = [IncrementalMdl.Beta(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)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; beta1(j + 1) = IncrementalMdl.Beta(1); end
IncrementalMdl
является incrementalClassificationLinear
объект модели, который отслеживал производительность модели до наблюдений в потоке данных.
Постройте график трассировки метрик эффективности и оценочного коэффициента .
figure; subplot(2,1,1) h = plot(ce.Variables); xlim([0 nchunk]); ylabel('Classification Error') legend(h,ce.Properties.VariableNames) subplot(2,1,2) plot(beta1) ylabel('\beta_1') xlim([0 nchunk]); xlabel('Iteration')
Совокупные потери стабильны, в то время как потери окна скачут.
не меняется, потому что updateMetrics
не соответствует модели данным.
Создайте инкрементальную линейную модель SVM для двоичной классификации. Задайте период оценки 5000 наблюдений и решателя SGD.
Mdl = incrementalClassificationLinear('EstimationPeriod',5000,'Solver','sgd')
Mdl = incrementalClassificationLinear IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' Beta: [0x1 double] Bias: 0 Learner: 'svm' Properties, Methods
Mdl
является incrementalClassificationLinear
модель. Все его свойства доступны только для чтения.
Определите, является ли модель теплой, и размер периода прогрева метрики, запросив свойства модели.
isWarm = Mdl.IsWarm
isWarm = logical
0
mwp = Mdl.MetricsWarmupPeriod
mwp = 1000
Mdl.IsWarm
является 0;
поэтому Mdl
не тепло.
Определите количество инкрементных функций аппроксимации наблюдений, таких как fit
, необходимо обработать перед измерением эффективности модели.
numObsBeforeMetrics = Mdl.MetricsWarmupPeriod + Mdl.EstimationPeriod
numObsBeforeMetrics = 6000
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
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;
Выполните инкрементальное обучение. При каждой итерации выполните следующие действия:
Симулируйте поток данных путем обработки фрагмента 50 наблюдений.
Измерьте метрики производительности модели на входящем фрагменте с помощью updateMetrics
. Перезаписать модель входа.
Подбор модели к входящему фрагменту. Перезаписать модель входа.
Магазин и вероятность ошибки неправильной классификации, чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta1 = zeros(nchunk,1); % Incremental fitting 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,:} = Mdl.Metrics{"ClassificationError",:}; Mdl = fit(Mdl,X(idx,:),Y(idx)); beta1(j) = Mdl.Beta(1); end
IncrementalMdl
является incrementalClassificationLinear
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как параметры развивались во время инкрементного обучения, постройте их на отдельных подграфиках.
figure; subplot(2,1,1) plot(beta1) ylabel('\beta_1') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') axis tight subplot(2,1,2) plot(ce.Variables); ylabel('ClassificationError') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xline(numObsBeforeMetrics/numObsPerChunk,'g-.'); xlabel('Iteration') xlim([0 nchunk]); legend(ce.Properties.VariableNames)
mdlIsWarm = numObsBeforeMetrics/numObsPerChunk
mdlIsWarm = 120
График предполагает, что fit
не подгоняет модель к данным или обновляет параметры до окончания периода оценки. Кроме того, updateMetrics
не отслеживает ошибку классификации до тех пор, пока не завершится оценка и период прогрева метрики (120 фрагменты).
Пошагово обучите линейную регрессионую модель, только когда ее эффективность ухудшается.
Загрузите и перетащите набор данных о корпусе NYC 2015 года. Для получения дополнительной информации о данных смотрите Открытые данные NYC.
load NYCHousing2015 rng(1) % For reproducibility n = size(NYCHousing2015,1); shuffidx = randsample(n,n); NYCHousing2015 = NYCHousing2015(shuffidx,:);
Извлеките переменную отклика SALEPRICE
со таблицы. Для числовой устойчивости шкалы SALEPRICE
по 1e6
.
Y = NYCHousing2015.SALEPRICE/1e6; NYCHousing2015.SALEPRICE = [];
Создайте фиктивные матрицы из категориальных предикторов.
catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"]; dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015,... 'InputVariables',catvars); dumvarmat = table2array(dumvarstbl); NYCHousing2015(:,catvars) = [];
Все другие числовые переменные в таблице рассматриваются как линейные предикторы продажной цены. Конкатенируйте матрицу фиктивных переменных с остальными данными предиктора и транспонируйте данные, чтобы ускорить расчеты.
idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform'); X = [dumvarmat NYCHousing2015{:,idxnum}]';
Сконфигурируйте линейную регрессионую модель для инкрементного обучения, чтобы она не имела периода прогрева оценки или метрики. Задайте размер окна метрики 1000 наблюдений. Подгонка сконфигурированной модели к первым 100 наблюдениям и установка ориентации наблюдений вдоль столбцов данных.
Mdl = incrementalRegressionLinear('EstimationPeriod',0,'MetricsWarmupPeriod',0,... 'MetricsWindowSize',1000); numObsPerChunk = 100; Mdl = fit(Mdl,X(:,1:numObsPerChunk),Y(1:numObsPerChunk),'ObservationsIn','columns');
Mdl
является incrementalRegressionLinear
объект модели.
Выполните инкрементальное обучение с условным подбором кривой, выполнив эту процедуру для каждой итерации:
Симулируйте поток данных путем обработки фрагмента 100 наблюдений.
Обновите производительность модели путем вычисления нечувствительных к эпсилону потерь в окне 200 наблюдений. Задайте, что наблюдения ориентированы вдоль столбцов данных.
Подгонка модели к фрагменту данных только тогда, когда потеря более чем в два раза больше, чем минимальная потеря. Задайте, что наблюдения ориентированы вдоль столбцов данных.
При отслеживании эффективности и подбора кривой перезаписайте предыдущую инкрементную модель.
Сохраните эпсилон нечувствительные потери и чтобы увидеть, как изменяются потери и коэффициент во время обучения.
Отследите, когда fit
обучает модель.
% Preallocation n = numel(Y) - numObsPerChunk; nchunk = floor(n/numObsPerChunk); beta313 = zeros(nchunk,1); ei = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]); trained = false(nchunk,1); % Incremental fitting for j = 2:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = updateMetrics(Mdl,X(:,idx),Y(idx),'ObservationsIn','columns'); ei{j,:} = Mdl.Metrics{"EpsilonInsensitiveLoss",:}; minei = min(ei{:,2}); pdiffloss = (ei{j,2} - minei)/minei*100; if pdiffloss > 100 Mdl = fit(Mdl,X(:,idx),Y(idx),'ObservationsIn','columns'); trained(j) = true; end beta313(j) = Mdl.Beta(end); end
Mdl
является incrementalRegressionLinear
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как производительность модели и развивался во время обучения, строил их на отдельных подграфиках.
subplot(2,1,1) plot(beta313) hold on plot(find(trained),beta313(trained),'r.') ylabel('\beta_{313}') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); legend('\beta_{313}','Training occurs','Location','southeast') hold off subplot(2,1,2) plot(ei.Variables) ylabel('Epsilon Insensitive Loss') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') legend(ei.Properties.VariableNames)
График трассировки показывает периоды постоянных значений, в течение которых потеря не удвоилась с минимального пережитого.
Mdl
- Модель инкрементного обучения, эффективность которой измеряетсяincrementalClassificationLinear
объект модели | incrementalRegressionLinear
объект моделиМодель инкрементного обучения, эффективность которой измеряется, задается как incrementalClassificationLinear
или incrementalRegressionLinear
объект модели. Можно создавать Mdl
непосредственно или путем преобразования поддерживаемой, традиционно обученной модели машинного обучения с помощью incrementalLearner
функция. Для получения дополнительной информации см. соответствующую страницу с описанием.
Если Mdl.IsWarm
является false
, updateMetrics
не отслеживает эффективность модели. Вы должны подогнать Mdl
на Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod
наблюдения путем прохождения Mdl
и данные для fit
прежде updateMetrics
может отслеживать метрики эффективности. Для получения дополнительной информации см. «Алгоритмы».
X
- Фрагмент данных предиктораФрагмент данных предиктора, с помощью которого можно измерить производительность модели, заданный как матрица с плавающей точкой n наблюдений и Mdl.NumPredictors
переменные предиктора. Значение 'ObservationsIn'
аргумент пары "имя-значение" определяет ориентацию переменных и наблюдений.
Длина меток наблюдений 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 наблюдения (строка или столбец) в X(j
).
Для задач классификации:
updateMetrics
поддерживает только двоичную классификацию.
Когда ClassNames
свойство модели входа Mdl
не пуст, применяются следующие условия:
Если Y
содержит метку, которая не является представителем Mdl.ClassNames
, updateMetrics
выдает ошибку.
Тип данных Y
и Mdl.ClassNames
должно быть то же самое.
Типы данных: char
| string
| cell
| categorical
| logical
| single
| double
Примечание
Если наблюдение (предиктор или метка) или вес Weight
содержит по крайней мере один отсутствующий (NaN
) значение, updateMetrics
игнорирует наблюдение. Следовательно, updateMetrics
использует меньше n наблюдений для вычисления производительности модели.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'ObservationsIn','columns','Weights',W
задает, что столбцы матрицы предиктора соответствуют наблюдениям, и вектор W
содержит веса наблюдений, применяемые во время инкрементного обучения.'ObservationsIn'
- размерность наблюдения данных предиктора'rows'
(по умолчанию) | 'columns'
Размерность наблюдения данных предиктора, заданная как разделенная разделенными запятой парами, состоящая из 'ObservationsIn'
и 'columns'
или 'rows'
.
Типы данных: char
| string
'Weights'
- Фрагмент весов наблюденийФрагмент весов наблюдений, заданный как разделенная разделенными запятой парами, состоящая из 'Weights'
и вектор с плавающей точкой положительных значений. updateMetrics
взвешивает наблюдения в X
с соответствующими значениями в Weights
. Размер Weights
должен равняться n, это количество наблюдений в X
.
По умолчанию Weights
это таковые
.(n
,1)
Для получения дополнительной информации, включая схемы нормализации, см. «Веса наблюдений».
Типы данных: double
| single
Mdl
- Обновленная модель инкрементного обученияincrementalClassificationLinear
объект модели | incrementalRegressionLinear
объект моделиОбновленная модель инкрементного обучения, возвращенная как объект инкрементной модели обучения совпадающего типа данных, что и входная модель Mdl
, либо incrementalClassificationLinear
или incrementalRegressionLinear
.
Если модель не теплая, 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.
Если Mdl.EstimationPeriod
> 0, функции оценивают гиперпараметры перед подгонкой модели к данным. Поэтому функции должны обрабатывать дополнительное EstimationPeriod
наблюдения перед началом модели периода прогрева метрики.
The 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
нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений являются соответствующими вероятностями предыдущего класса по умолчанию.
Для регрессионных задач или если распределение вероятностей предыдущего класса эмпирическое, программное обеспечение нормализует указанные веса наблюдений до суммы 1 каждый раз, когда вы вызываете updateMetrics
.
Указания и ограничения по применению:
Использовать saveLearnerForCoder
, loadLearnerForCoder
, и codegen
(MATLAB Coder), чтобы сгенерировать код для updateMetrics
функция. Сохраните обученную модель при помощи saveLearnerForCoder
. Задайте функцию точки входа, которая загружает сохраненную модель при помощи loadLearnerForCoder
и вызывает updateMetrics
функция. Затем используйте codegen
чтобы сгенерировать код для функции точки входа.
Чтобы сгенерировать одноточный код C/C + + для updateMetrics, задайте аргумент
имя-значение 'DataType','single'
когда вы вызываете loadLearnerForCoder
функция.
Эта таблица содержит примечания к аргументам updateMetrics
. Аргументы, не включенные в эту таблицу, полностью поддерживаются.
Аргумент | Примечания и ограничения |
---|---|
| Для указаний по применению и ограничений объекта модели смотрите |
|
|
|
|
Действуют следующие ограничения:
Если вы конфигурируете Mdl
для тасования данных (Mdl.Shuffle
является true
, или Mdl.Solver
является 'sgd'
или 'asgd'
), updateMetrics
функция случайным образом перетасовывает каждый входящий пакет наблюдений, прежде чем он подгоняет модель к пакету. Порядок перетасованных наблюдений может не совпадать с порядком, сгенерированным MATLAB®. Поэтому, если вы подходите Mdl
перед обновлением метрик эффективности метрики, вычисленные в MATLAB и вычисленные сгенерированным кодом, могут быть не равны.
Используйте однородный тип данных для всех входных параметров с плавающей точкой и свойств объекта, в частности, либо single
или double
.
Для получения дополнительной информации смотрите Введение в генерацию кода.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.