Обучите линейную модель для инкрементного обучения
fit
функция подходит для сконфигурированной модели инкрементного обучения для линейной регрессии (incrementalRegressionLinear
объект) или линейная двоичная классификация (incrementalClassificationLinear
объект) для потоковой передачи данных. Чтобы дополнительно отследить показатели эффективности, используя данные по мере их поступления, используйте updateMetricsAndFit
вместо этого.
Для подгонки или перекрестной проверки регрессионной или классификационной модели ко всему пакету данных сразу, смотрите другие модели машинного обучения в Регрессии или Классификации.
возвращает модель инкрементного обучения Mdl
= fit(Mdl
,X
,Y
)Mdl
, которая представляет входу модель инкрементного обучения Mdl
обучен с использованием предиктора и данных отклика, X
и Y
соответственно. В частности, fit
реализует следующую процедуру:
Модели входа и выхода являются совпадающим типом данных.
Создайте пошаговую линейную модель 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
модель. Все его свойства доступны только для чтения.
Mdl
необходимо соответствовать данным, прежде чем использовать их для выполнения любых других операций.
Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.
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 наблюдений за раз при помощи fit
функция. При каждой итерации:
Симулируйте поток данных путем обработки 50 наблюдений.
Перезаписать предыдущую инкрементальную модель на новую, подобранную входящему наблюдению.
Магазин , количество обучающих наблюдений и априорная вероятность того, переместился ли субъект (Y
= true
), чтобы увидеть, как они развиваются во время инкрементного обучения.
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); beta1 = zeros(nchunk,1); numtrainobs = zeros(nchunk,1); priormoved = 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 = fit(Mdl,X(idx,:),Y(idx)); beta1(j) = Mdl.Beta(1); numtrainobs(j) = Mdl.NumTrainingObservations; priormoved(j) = Mdl.Prior(Mdl.ClassNames == true); end
IncrementalMdl
является incrementalClassificationLinear
объект модели обучен на всех данных в потоке.
Чтобы увидеть, как параметры развивались во время инкрементного обучения, постройте их на отдельных подграфиках.
figure; subplot(2,2,1) plot(beta1) ylabel('\beta_1') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') axis tight subplot(2,2,2) plot(numtrainobs); ylabel('Number of Training Observations') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') axis tight subplot(2,2,3) plot(priormoved); ylabel('Prior P(Subject Moved)') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') axis tight
График предполагает, что fit
не подгоняет модель к данным или обновляет параметры до окончания периода оценки.
Обучите линейную модель для двоичной классификации с помощью 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;
Предположим, что данные, собранные, когда субъект не двигался (Y
= false
) имеет удвоенное качество, чем когда субъект двигался. Создайте весовую переменную, которая атрибутирует 2 наблюдениям, собранным от неподвижного субъекта, и 1 - движущемуся субъекту.
W = ones(n,1) + ~Y;
Обучите линейную модель для двоичной классификации
Подбор линейной модели для двоичной классификации к случайной выборке из половины данных.
idxtt = randsample([true false],n,true); TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns',... 'Weights',W(idxtt))
TTMdl = ClassificationLinear ResponseName: 'Y' ClassNames: [0 1] ScoreTransform: 'none' Beta: [60x1 double] Bias: -0.1107 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.1107 Learner: 'svm' Properties, Methods
Отдельно отслеживайте метрики эффективности и подгоняйте модель
Выполните инкрементальное обучение для остальных данных с помощью updateMetrics
и fit
функций. При каждой итерации:
Симулируйте поток данных путем обработки 50 наблюдений за раз.
Функции updateMetrics
обновить совокупную и оконную ошибку классификации модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics
свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели. Задайте, что наблюдения ориентированы в столбцах, и задайте веса наблюдений.
Функции fit
для подгонки модели к входящему фрагменту наблюдений. Перезаписайте предыдущую инкрементную модель, чтобы обновить параметры модели. Задайте, что наблюдения ориентированы в столбцах, и задайте веса наблюдений.
Сохраните ошибку классификации и первый оцененный коэффициент .
% 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); Wil = W(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),... 'ObservationsIn','columns','Weights',Wil(idx)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns',... 'Weights',Wil(idx)); beta1(j + 1) = IncrementalMdl.Beta(1); end
IncrementalMdl
является incrementalClassificationLinear
объект модели обучен на всех данных в потоке.
Также можно использовать updateMetricsAndFit
чтобы обновить метрики эффективности модели, заданные новый фрагмент данных, и затем подгонять модель к данным.
Постройте график трассировки метрик эффективности и оценочного коэффициента .
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')
Совокупные потери стабильны и постепенно уменьшаются, в то время как потери окна скачут.
изменяется постепенно, затем выравнивается, как fit
обрабатывает больше фрагменты.
Пошагово обучите линейную регрессионую модель, только когда ее эффективность ухудшается.
Загрузите и перетащите набор данных о корпусе 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));
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)); 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)); 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
функция. Для получения дополнительной информации см. соответствующую страницу с описанием.
X
- Фрагмент данных предиктораФрагмент данных предиктора, к которым подходит модель, заданный как матрица с плавающей точкой n наблюдений и Mdl.NumPredictors
переменные предиктора. Значение 'ObservationsIn'
аргумент пары "имя-значение" определяет ориентацию переменных и наблюдений.
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в (j
)X
.
Примечание
Если Mdl.NumPredictors
= 0, fit
выводит количество предикторов из X
, и устанавливает свойство congruent модели выхода. В противном случае, если количество переменных предиктора в потоковых данных изменяется с Mdl.NumPredictors
, fit
выдает ошибку.
fit
поддерживает только входные данные предиктора с плавающей точкой. Если модель входа Mdl
представляет собой преобразованную, традиционно обученную модель, подходящую для категориальных данных, использование dummyvar
чтобы преобразовать каждую категориальную переменную в числовую матрицу фиктивных переменных и объединить все фиктивные переменные матрицы и любые другие числовые предикторы. Для получения дополнительной информации см. Dummy Переменных.
Типы данных: single
| double
Y
- Фрагмент метокФрагмент меток, к которым подгоняется модель, задается как категориальные символьные или строковые массивы, логический вектор или вектор с плавающей точкой или массив ячеек из векторов символов для задач классификации; или вектор с плавающей точкой для регрессионных задач.
Длина меток наблюдений Y
и количество наблюдений в X
должна быть равной; Y
- метка j наблюдения (строка или столбец) в X(j
).
Для задач классификации:
fit
поддерживает только двоичную классификацию.
Когда ClassNames
свойство модели входа Mdl
не пуст, применяются следующие условия:
Если Y
содержит метку, которая не является представителем Mdl.ClassNames
, fit
выдает ошибку.
Тип данных Y
и Mdl.ClassNames
должно быть то же самое.
Типы данных: char
| string
| cell
| categorical
| logical
| single
| double
Примечание
Если наблюдение (предиктор или метка) или вес Weight
содержит по крайней мере один отсутствующий (NaN
) значение, fit
игнорирует наблюдение. Следовательно, fit
использует меньше n наблюдений для вычисления производительности модели.
Размер фрагмента n и стохастический градиентный спуск (SGD) гиперпараметра размер пакета (Mdl.BatchSize
) могут быть различными значениями. Если n < Mdl.BatchSize
, fit
использует n доступные наблюдения при применении SGD.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'ObservationsIn','columns','Weights',W
задает, что столбцы матрицы предиктора соответствуют наблюдениям, и вектор W
содержит веса наблюдений, применяемые во время инкрементного обучения.'ObservationsIn'
- размерность наблюдения данных предиктора'rows'
(по умолчанию) | 'columns'
Размерность наблюдения данных предиктора, заданная как разделенная разделенными запятой парами, состоящая из 'ObservationsIn'
и 'columns'
или 'rows'
.
Типы данных: char
| string
'Weights'
- Фрагмент весов наблюденийФрагмент весов наблюдений, заданный как разделенная разделенными запятой парами, состоящая из 'Weights'
и вектор с плавающей точкой положительных значений. fit
взвешивает наблюдения в X
с соответствующими значениями в Weights
. Размер Weights
должен равняться n, это количество наблюдений в X
.
По умолчанию Weights
это таковые
.(n
,1)
Для получения дополнительной информации, включая схемы нормализации, см. «Веса наблюдений».
Типы данных: double
| single
Mdl
- Обновленная модель инкрементного обученияincrementalClassificationLinear
объект модели | incrementalRegressionLinear
объект моделиОбновленная модель инкрементного обучения, возвращенная как объект инкрементной модели обучения совпадающего типа данных, что и входная модель Mdl
, либо incrementalClassificationLinear
или incrementalRegressionLinear
.
Если Mdl.EstimationPeriod
> 0, инкрементальные функции аппроксимации updateMetricsAndFit
и fit
оценить гиперпараметры используя первую Mdl.EstimationPeriod
наблюдения перешли к любой из функций; они не обучают модель входа этим данным. Однако, если входящий фрагмент n наблюдений больше или равен количеству наблюдений, остающихся в m периода оценки, fit
оценивает гиперпараметры, используя первые n - m наблюдения, и подгоняет входную модель к остальным m наблюдениям. Следовательно, программное обеспечение обновляет Beta
и Bias
свойства, свойства гиперпараметра и свойства ведения записей, такие как NumTrainingObservations
.
Для задач классификации, если ClassNames
свойство модели входа Mdl
- пустой массив, fit
устанавливает ClassNames
свойство модели выхода Mdl
на unique(Y)
.
В отличие от традиционного обучения, инкрементальное обучение может не иметь отдельного теста (holdout) набора. Поэтому, чтобы обработать каждый входящий фрагмент данных как тестовый набор, передайте инкрементальную модель и каждый входящий фрагмент updateMetrics
перед обучением модели на тех же данных.
Для задач классификации, если известно распределение вероятностей предыдущего класса (другими словами, предшествующее распределение не является эмпирическим), fit
нормализует веса наблюдений в сумме с предшествующими вероятностями классов в соответствующих классах. Это действие подразумевает, что веса наблюдений являются соответствующими вероятностями предыдущего класса по умолчанию.
Для регрессионных задач или если распределение вероятностей предыдущего класса эмпирическое, программное обеспечение нормализует указанные веса наблюдений до суммы 1 каждый раз, когда вы вызываете fit
.
Указания и ограничения по применению:
Использовать saveLearnerForCoder
, loadLearnerForCoder
, и codegen
(MATLAB Coder), чтобы сгенерировать код для fit
функция. Сохраните обученную модель при помощи saveLearnerForCoder
. Задайте функцию точки входа, которая загружает сохраненную модель при помощи loadLearnerForCoder
и вызывает fit
функция. Затем используйте codegen
чтобы сгенерировать код для функции точки входа.
Чтобы сгенерировать одноточный код C/C + + для подгонки, задайте аргумент
имя-значение 'DataType','single'
когда вы вызываете loadLearnerForCoder
функция.
Эта таблица содержит примечания к аргументам fit
. Аргументы, не включенные в эту таблицу, полностью поддерживаются.
Аргумент | Примечания и ограничения |
---|---|
| Для указаний по применению и ограничений объекта модели смотрите |
|
|
|
|
Действуют следующие ограничения:
Если вы конфигурируете Mdl
для тасования данных (Mdl.Shuffle
является true
, или Mdl.Solver
является 'sgd'
или 'asgd'
), fit
функция случайным образом перетасовывает каждый входящий пакет наблюдений, прежде чем он подгоняет модель к пакету. Порядок перетасованных наблюдений может не совпадать с порядком, сгенерированным MATLAB®. Поэтому установленные коэффициенты, вычисленные в MATLAB и сгенерированном коде, могут быть не равны.
Используйте однородный тип данных для всех входных параметров с плавающей точкой и свойств объекта, в частности, либо single
или double
.
Для получения дополнительной информации смотрите Введение в генерацию кода.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.