Потеря линейной модели для инкрементного обучения на пакете данных
loss
возвращает регрессию или потерю классификации сконфигурированной модели инкрементного обучения для линейной регрессии (incrementalRegressionLinear
объект) или линейная двоичная классификация (incrementalClassificationLinear
объект).
Чтобы измерить производительность модели в потоке данных и сохранить результаты в модели выхода, вызовите updateMetrics
или updateMetricsAndFit
.
Эффективность инкрементальной модели на потоковых данных измеряется тремя способами:
Кумулятивные метрики измеряют эффективность с начала инкрементного обучения.
Метрики окна измеряют эффективность в заданном окне наблюдений. Метрики обновляются каждый раз, когда модель обрабатывает указанное окно.
The loss
функция измеряет эффективность только для заданного пакета данных.
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
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;
Создайте инкрементальную линейную модель SVM для двоичной классификации. Сконфигурируйте его для loss
путем определения имен классов, предыдущего распределения классов (равномерного) и произвольных значений коэффициентов и смещений. Задайте размер окна метрики 1000 наблюдений.
p = size(X,2); Beta = randn(p,1); Bias = randn(1); Mdl = incrementalClassificationLinear('Beta',Beta,'Bias',Bias,... 'ClassNames',unique(Y),'Prior','uniform','MetricsWindowSize',1000);
Mdl
является incrementalClassificationLinear
модель. Все его свойства доступны только для чтения. Вместо того, чтобы задавать произвольные значения, можно предпринять одно из следующих действий, чтобы сконфигурировать модель:
Обучите модель SVM с помощью fitcsvm
или fitclinear
на подмножестве данных (при наличии), а затем преобразуйте модель в пошагового ученика при помощи incrementalLearner
.
Пошагово подгоняемые Mdl
к данным при помощи fit
.
Симулируйте поток данных и выполните следующие действия на каждом входящем фрагменте из 50 наблюдений:
Функции updateMetrics
для измерения совокупной эффективности и эффективности в окне наблюдений. Перезаписать предыдущую инкрементальную модель на новую для отслеживания показателей эффективности.
Функции loss
для измерения производительности модели на входящем фрагменте.
Функции fit
для подгонки модели к входящему фрагменту. Перезаписать предыдущую инкрементальную модель на новую, подобранную входящему наблюдению.
Сохраните все метрики эффективности, чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Loss"]); % 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)); ce{j,["Cumulative" "Window"]} = Mdl.Metrics{"ClassificationError",:}; ce{j,"Loss"} = loss(Mdl,X(idx,:),Y(idx)); Mdl = fit(Mdl,X(idx,:),Y(idx)); end
Mdl
является incrementalClassificationLinear
объект модели обучен на всех данных в потоке. Во время инкрементного обучения и после прогрева модели updateMetrics
проверяет эффективность модели при входящем наблюдении, затем и fit
функция соответствует модели этому наблюдению. loss
является агностическим для периода прогрева метрики, поэтому измеряет ошибку классификации для всех итераций.
Чтобы увидеть, как метрики эффективности развивались во время обучения, постройте их.
figure; plot(ce.Variables); xlim([0 nchunk]); ylim([0 0.05]) ylabel('Classification Error') xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.'); legend(ce.Properties.VariableNames) xlabel('Iteration')
В течение периода прогрева метрики (область слева от красной линии) желтая линия представляет ошибку классификации для каждого входящего фрагмента данных. После периода прогрева метрики Mdl
отслеживает совокупные и оконные метрики. Совокупные и пакетные потери сходятся как fit
функция подходит для инкрементальной модели к входящим данным.
Подбор модели инкрементного обучения для регрессии к потоковым данным и вычисление среднего абсолютного отклонения (MAD) во входящих пакетах данных.
Загрузите набор данных руки робота. Получите размер выборки n
и количество переменных предиктора p
.
load robotarm
n = numel(ytrain);
p = size(Xtrain,2);
Для получения дополнительной информации о наборе данных введите Description
в командной строке.
Создайте инкрементальную линейную модель для регрессии. Сконфигурируйте модель следующим образом:
Задайте период прогрева метрики 1000 наблюдений.
Задайте размер окна метрики 500 наблюдений.
Отслеживайте среднее абсолютное отклонение (MAD), чтобы измерить эффективность модели. Создайте анонимную функцию, которая измеряет абсолютную ошибку каждого нового наблюдения. Создайте массив структур, содержащий имя MeanAbsoluteError
и ее соответствующую функцию.
Сконфигурируйте модель, чтобы предсказать ответы, указав, что все коэффициенты регрессии и смещение равны 0.
maefcn = @(z,zfit,w)(abs(z - zfit)); maemetric = struct("MeanAbsoluteError",maefcn); Mdl = incrementalRegressionLinear('MetricsWarmupPeriod',1000,'MetricsWindowSize',500,... 'Metrics',maemetric,'Beta',zeros(p,1),'Bias',0,'EstimationPeriod',0)
Mdl = incrementalRegressionLinear IsWarm: 0 Metrics: [2x2 table] ResponseTransform: 'none' Beta: [32x1 double] Bias: 0 Learner: 'svm' Properties, Methods
Mdl
является incrementalRegressionLinear
объект модели, сконфигурированный для инкрементного обучения.
Выполните инкрементальное обучение. При каждой итерации:
Симулируйте поток данных путем обработки фрагмента 50 наблюдений.
Функции updateMetrics
вычислить совокупные и оконные метрики на входящем фрагменты данных. Перезаписать предыдущую инкрементальную модель на новую, подобранную для перезаписи предыдущих метрик.
Функции loss
для вычисления MAD на входящем фрагменты данных. В то время как совокупная и оконная метрики требуют, чтобы пользовательские потери возвращали потери для каждого наблюдения, loss
требуется потеря всего фрагмента. Вычислите среднее значение абсолютного отклонения.
Функции fit
для подгонки инкрементальной модели к входящему фрагменту данных.
Сохраните совокупные, оконные и частичные метрики, чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); mae = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Chunk"]); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = updateMetrics(Mdl,Xtrain(idx,:),ytrain(idx)); mae{j,1:2} = Mdl.Metrics{"MeanAbsoluteError",:}; mae{j,3} = loss(Mdl,Xtrain(idx,:),ytrain(idx),'LossFun',@(x,y,w)mean(maefcn(x,y,w))); Mdl = fit(Mdl,Xtrain(idx,:),ytrain(idx)); end
IncrementalMdl
является incrementalRegressionLinear
объект модели обучен на всех данных в потоке. Во время инкрементного обучения и после прогрева модели updateMetrics
проверяет эффективность модели при входящем наблюдении и fit
функция соответствует модели этому наблюдению.
Постройте график показателей эффективности, чтобы увидеть, как они развивались во время инкрементного обучения.
figure; h = plot(mae.Variables); ylabel('Mean Absolute Deviation') xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') legend(h,mae.Properties.VariableNames)
График предполагает следующее:
updateMetrics
вычисляет показатели эффективности только после периода прогрева метрики.
updateMetrics
вычисляет совокупные метрики во время каждой итерации.
updateMetrics
вычисляет метрики окна после обработки 500 наблюдений
Потому что Mdl
был сконфигурирован так, чтобы предсказывать наблюдения с начала инкрементного обучения, loss
можно вычислить MAD для каждого входящего фрагмента данных.
Mdl
- Модель инкрементного обученияincrementalClassificationLinear
объект модели | incrementalRegressionLinear
объект моделиМодель инкрементного обучения, заданная как incrementalClassificationLinear
или incrementalRegressionLinear
объект модели. Можно создавать Mdl
непосредственно или путем преобразования поддерживаемой, традиционно обученной модели машинного обучения с помощью incrementalLearner
функция. Для получения дополнительной информации см. соответствующую страницу с описанием.
Необходимо сконфигурировать Mdl
вычислить его потери по пакету наблюдений.
Если Mdl
является преобразованной, традиционно обученной моделью, вычислить ее потерю можно без каких-либо изменений.
В противном случае Mdl
должен удовлетворять следующим критериям, которые можно задать непосредственно или путем подгонки Mdl
к данным с помощью fit
или updateMetricsAndFit
.
Если Mdl
является incrementalRegressionLinear
модель, ее коэффициенты модели Mdl.Beta
и смещение Mdl.Bias
не должны быть пустыми массивами.
Если Mdl
является incrementalClassificationLinear
модель, ее коэффициенты модели Mdl.Beta
и смещение Mdl.Bias
должны быть непустыми массивами, именами классов Mdl.ClassNames
должен содержать два класса и предшествующее распределение классов Mdl.Prior
должны содержать известные значения.
Независимо от типа объекта, если вы конфигурируете модель так, эти функции стандартизировали данные предиктора, предиктор означает Mdl.Mu
и стандартные отклонения Mdl.Sigma
не должны быть пустыми массивами.
X
- Пакет данных предиктораПакет данных предиктора, с помощью которых можно вычислить потерю, заданный как матрица с плавающей точкой n наблюдений и Mdl.NumPredictors
переменные предиктора. Значение 'ObservationsIn'
аргумент пары "имя-значение" определяет ориентацию переменных и наблюдений.
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в (j
)X
.
Примечание
loss
поддерживает только входные данные предиктора с плавающей точкой. Если модель входа Mdl
представляет собой преобразованную, традиционно обученную модель, подходящую для категориальных данных, использование dummyvar
чтобы преобразовать каждую категориальную переменную в числовую матрицу фиктивных переменных и объединить все фиктивные переменные матрицы и любые другие числовые предикторы. Для получения дополнительной информации см. Dummy Переменных.
Типы данных: single
| double
Y
- Партия метокПакет меток, с помощью которых можно вычислить потерю, заданный как категориальные символьные или строковые массивы, логический вектор или вектор с плавающей точкой или массив ячеек векторов символов для задач классификации; или вектор с плавающей точкой для регрессионных задач.
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в (j
)X
.
Для задач классификации:
loss
поддерживает только двоичную классификацию.
Когда 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
.
'ObservationsIn','columns','Weights',W
задает, что столбцы матрицы предиктора соответствуют наблюдениям, и вектор W
содержит применяемые веса наблюдений.'LossFun'
- Функция потерьФункция потерь, заданная как разделенная разделенными запятой парами, состоящая из 'LossFun'
и встроенное имя функции потери или указатель на функцию.
Задачи классификации: В следующей таблице перечислены доступные функции потерь при Mdl
является incrementalClassificationLinear
модель. Задайте один с помощью соответствующего вектора символов или строкового скаляра.
Имя | Описание |
---|---|
"binodeviance" | Биномиальное отклонение |
"classiferror" (по умолчанию) | Коэффициент неправильной классификации в десятичных числах |
"exponential" | Экспоненциальные потери |
"hinge" | Потеря шарнира |
"logit" | Логистические потери |
"quadratic" | Квадратичные потери |
Для получения дополнительной информации смотрите Классификационные потери.
Учащиеся логистической регрессии возвращают апостериорные вероятности как классификационные оценки, но ученики SVM этого не делают (см. predict
).
Чтобы задать пользовательскую функцию потерь, используйте обозначение указателя на функцию. Функция должна иметь следующую форму:
lossval = lossfcn(C,S,W)
Выходной аргумент lossval
- вектор с n -by-1 с плавающей точкой, где lossval
классификационная потеря наблюдений (j
)
.j
Вы задаете имя функции (
).lossfcn
C
является n -by-2 логической матрицей с строками, указывающими класс, к которому принадлежит соответствующее наблюдение. Порядок столбцов соответствует порядку классов в ClassNames
свойство. Создание C
путем установки C
= (p
, q
)1
, если наблюдение
находится в p
, для каждого наблюдения в заданных данных. Установите другой элемент в строку q классов
на p
0
.
S
является n -by-2 числовой матрицей предсказанных классификационных оценок. S
аналогичен score
выхода predict
, где строки соответствуют наблюдениям в данных, а порядок столбцов соответствует порядку классов в ClassNames
свойство. S
- классификационная оценка наблюдения (p
, q
)
классифицируется в классах p
.q
W
является n -by-1 числовым вектором весов наблюдений.
Регрессионные задачи: В следующей таблице перечислены доступные функции потерь при Mdl
является incrementalRegressionLinear
модель. Задайте один с помощью соответствующего вектора символов или строкового скаляра.
Имя | Описание | Учащиеся, поддерживающие метрику |
---|---|---|
"epsiloninsensitive" | Эпсилоновые нечувствительные потери | 'svm' |
"mse" (по умолчанию) | Средневзвешенная квадратичная невязка | 'svm' и 'leastsquares' |
Для получения дополнительной информации смотрите Регрессионные потери.
Чтобы задать пользовательскую функцию потерь, используйте обозначение указателя на функцию. Функция должна иметь следующую форму:
lossval = lossfcn(Y,YFit,W)
Выходной аргумент lossval
является скаляром с плавающей точкой.
Вы задаете имя функции (
).lossfcn
Y
является длинным n числовым вектором наблюдаемых откликов.
YFit
является длинным n числовым вектором соответствующих предсказанных откликов.
W
является n -by-1 числовым вектором весов наблюдений.
Пример: 'LossFun',"mse"
Пример: 'LossFun',
@ lossfcn
Типы данных: char
| string
| function_handle
'ObservationsIn'
- размерность наблюдения данных предиктора'rows'
(по умолчанию) | 'columns'
Размерность наблюдения данных предиктора, заданная как разделенная разделенными запятой парами, состоящая из 'ObservationsIn'
и 'columns'
или 'rows'
.
Типы данных: char
| string
'Weights'
- Партия весов наблюденийПартия весов наблюдений, заданная как разделенная разделенными запятой парами, состоящая из 'Weights'
и вектор с плавающей точкой положительных значений. loss
взвешивает наблюдения в входных данных с соответствующими значениями в Weights
. Размер Weights
должен равняться n, которое является количеством наблюдений во входных данных.
По умолчанию Weights
это таковые
.(n
,1)
Для получения дополнительной информации см. «Веса наблюдений».
Типы данных: double
| single
Classification loss функции измеряют прогнозирующую неточность классификационных моделей. Когда вы сравниваете один и тот же тип потерь среди многих моделей, более низкая потеря указывает на лучшую прогнозирующую модель.
Рассмотрим следующий сценарий.
L - средневзвешенные классификационные потери.
n - размер выборки.
Для двоичной классификации:
yj - наблюдаемая метка класса. Программное обеспечение кодирует его как -1 или 1, указывая на отрицательный или положительный класс (или первый или второй класс в ClassNames
свойство), соответственно.
f (Xj) является баллом классификации положительного класса для j наблюдений (строка) X данных предиктора.
mj = yj f (Xj) является классификационной оценкой для классификации j наблюдений в класс, относящийся к yj. Положительные значения mj указывают на правильную классификацию и не вносят большой вклад в средние потери. Отрицательные значения mj указывают на неправильную классификацию и вносят значительный вклад в среднюю потерю.
Вес для j наблюдения wj.
С учетом этого сценария в следующей таблице описываются поддерживаемые функции потерь, которые можно задать при помощи 'LossFun'
аргумент пары "имя-значение".
Функция потерь | Значение LossFun | Уравнение |
---|---|---|
Биномиальное отклонение | "binodeviance" | |
Экспоненциальные потери | "exponential" | |
Коэффициент неправильной классификации в десятичных числах | "classiferror" | - метка класса, соответствующая классу с максимальным счетом. I {·} является функцией индикации. |
Потеря шарнира | "hinge" | |
Логит потеря | "logit" | |
Квадратичные потери | "quadratic" |
Этот рисунок сравнивает функции потерь по сравнению с счетом m для одного наблюдения. Некоторые функции нормированы, чтобы пройти через точку (0,1).
Regression loss функции измеряют прогнозирующую неточность регрессионых моделей. Когда вы сравниваете один и тот же тип потерь среди многих моделей, более низкая потеря указывает на лучшую прогнозирующую модель.
Рассмотрим следующий сценарий.
L - средневзвешенные классификационные потери.
n - размер выборки.
yj - наблюдаемая реакция j наблюдений.
f (Xj) = β 0 + xj β является предсказанным значением j наблюдений X данных предиктора, где β 0 является смещением, а β является вектором коэффициентов.
Вес для j наблюдения wj.
С учетом этого сценария в следующей таблице описываются поддерживаемые функции потерь, которые можно задать при помощи 'LossFun'
аргумент пары "имя-значение".
Функция потерь | Значение LossFun | Уравнение |
---|---|---|
Эпсилоновые нечувствительные потери | "epsiloninsensitive" |
|
Средняя квадратичная невязка | "mse" |
|
Для задач классификации, если известно распределение вероятностей предыдущего класса (другими словами, предшествующее распределение не является эмпирическим), loss
нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений являются соответствующими вероятностями предыдущего класса по умолчанию.
Для регрессионных задач или если распределение вероятностей предыдущего класса эмпирическое, программное обеспечение нормализует указанные веса наблюдений до суммы 1 каждый раз, когда вы вызываете loss
.
Указания и ограничения по применению:
Использовать saveLearnerForCoder
, loadLearnerForCoder
, и codegen
(MATLAB Coder), чтобы сгенерировать код для loss
функция. Сохраните обученную модель при помощи saveLearnerForCoder
. Задайте функцию точки входа, которая загружает сохраненную модель при помощи loadLearnerForCoder
и вызывает loss
функция. Затем используйте codegen
чтобы сгенерировать код для функции точки входа.
Чтобы сгенерировать одноточный код C/C + + для потерь, задайте аргумент
имя-значение 'DataType','single'
когда вы вызываете loadLearnerForCoder
функция.
Эта таблица содержит примечания к аргументам loss
. Аргументы, не включенные в эту таблицу, полностью поддерживаются.
Аргумент | Примечания и ограничения |
---|---|
| Для указаний по применению и ограничений объекта модели смотрите |
|
|
|
|
| Указанная функция не может быть анонимной функцией. |
Если вы конфигурируете Mdl
для тасования данных (Mdl.Shuffle
является true
, или Mdl.Solver
является 'sgd'
или 'asgd'
), loss
функция случайным образом перетасовывает каждый входящий пакет наблюдений, прежде чем он подгоняет модель к пакету. Порядок перетасованных наблюдений может не совпадать с порядком, сгенерированным MATLAB®. Поэтому, если вы подходите Mdl
перед вычислением потерь потери, вычисленные в MATLAB, и потери, вычисленные сгенерированным кодом, могут быть не равны.
Используйте однородный тип данных для всех входных параметров с плавающей точкой и свойств объекта, в частности, либо single
или double
.
Для получения дополнительной информации смотрите Введение в генерацию кода.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.