Класс: RegressionLinear
Потеря регрессии для моделей линейной регрессии
возвращает MSE для данных о предикторе в L
= loss(Mdl
,Tbl
,ResponseVarName
)Tbl
и истинные ответы в Tbl.ResponseVarName
.
задает опции с помощью одного или нескольких аргументов пары "имя-значение" в дополнение к любой из комбинаций входных аргументов в предыдущих синтаксисах. Например, укажите, что столбцы в данных о предикторе соответствуют наблюдениям или задают функцию потерь регрессии.L
= loss(___,Name,Value
)
Mdl
— Модель линейной регрессииRegressionLinear
объект моделиМодель линейной регрессии в виде RegressionLinear
объект модели. Можно создать RegressionLinear
использование объекта модели fitrlinear
.
X
— Данные о предиктореДанные о предикторе в виде n-by-p полная или разреженная матрица. Эта ориентация X
указывает, что строки соответствуют отдельным наблюдениям, и столбцы соответствуют отдельным переменным предикторам.
Примечание
Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns'
, затем вы можете испытать значительное сокращение во время вычисления.
Длина Y
и количество наблюдений в X
должно быть равным.
Типы данных: single
| double
Tbl
— Выборочные данныеВыборочные данные раньше обучали модель в виде таблицы. Каждая строка Tbl
соответствует одному наблюдению, и каждый столбец соответствует одному переменному предиктору. Опционально, Tbl
может содержать дополнительные столбцы для весов наблюдения и переменной отклика. Tbl
должен содержать все предикторы, используемые, чтобы обучить Mdl
. Многостолбцовые переменные и массивы ячеек кроме массивов ячеек из символьных векторов не позволены.
Если Tbl
содержит переменную отклика, используемую, чтобы обучить Mdl
, затем вы не должны задавать ResponseVarName
или Y
.
Если вы обучаете Mdl
использование выборочных данных, содержавшихся в таблице, затем входные данные для loss
должен также быть в таблице.
ResponseVarName
— Имя переменной откликаTbl
Имя переменной отклика в виде имени переменной в Tbl
. Переменная отклика должна быть числовым вектором.
Если вы задаете ResponseVarName
, затем необходимо задать его как вектор символов или строковый скаляр. Например, если переменная отклика хранится как Tbl.Y
, затем задайте ResponseVarName
как 'Y'
. В противном случае программное обеспечение обрабатывает все столбцы Tbl
, включая Tbl.Y
, как предикторы.
Типы данных: char |
string
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
'LossFun'
— Функция потерь'mse'
(значение по умолчанию) | 'epsiloninsensitive'
| указатель на функциюФункция потерь в виде разделенной запятой пары, состоящей из 'LossFun'
и встроенное имя функции потерь или указатель на функцию.
В следующей таблице перечислены доступные функции потерь. Задайте тот с помощью его соответствующего значения. Кроме того, в таблице,
β является вектором из коэффициентов p.
x является наблюдением от переменных предикторов p.
b является скалярным смещением.
Значение | Описание |
---|---|
'epsiloninsensitive' | Нечувствительная к эпсилону потеря: |
'mse' | MSE: |
'epsiloninsensitive'
подходит для учеников SVM только.
Задайте свою собственную функцию с помощью обозначения указателя на функцию.
Позвольте n быть количеством наблюдений в X
. Ваша функция должна иметь эту подпись
lossvalue = lossfun
(Y,Yhat,W)
Выходной аргумент lossvalue
скаляр.
Вы выбираете имя функции (lossfun
).
Y
n - размерный вектор из наблюдаемых ответов. loss
передает входной параметр Y
в для Y
.
Yhat
n - размерный вектор из предсказанных ответов, который похож на выход predict
.
W
n-by-1 числовой вектор из весов наблюдения.
Задайте свое использование функции 'LossFun', @
.lossfun
Типы данных: char |
string
| function_handle
'ObservationsIn'
— Размерность наблюдения данных о предикторе'rows'
(значение по умолчанию) | 'columns'
Размерность наблюдения данных о предикторе в виде разделенной запятой пары, состоящей из 'ObservationsIn'
и 'columns'
или 'rows'
.
Примечание
Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns'
, затем вы можете испытать значительное сокращение во время выполнения оптимизации. Вы не можете задать 'ObservationsIn','columns'
для данных о предикторе в таблице.
'Weights'
— Веса наблюденияones(size(X,1),1)
(значение по умолчанию) | числовой вектор | имя переменной в Tbl
Веса наблюдения в виде разделенной запятой пары, состоящей из 'Weights'
и числовой вектор или имя переменной в Tbl
.
Если вы задаете Weights
как числовой вектор, затем размер Weights
должно быть равно количеству наблюдений в X
или Tbl
.
Если вы задаете Weights
как имя переменной в Tbl
, затем имя должно быть вектором символов или строковым скаляром. Например, если веса хранятся как Tbl.W
, затем задайте Weights
как 'W'
. В противном случае программное обеспечение обрабатывает все столбцы Tbl
, включая Tbl.W
, как предикторы.
Если вы предоставляете веса, loss
вычисляет взвешенную потерю регрессии и нормирует Weights
суммировать к 1.
Типы данных: double |
single
L
— Потери регрессииПримечание
Если Mdl.FittedLoss
'mse'
, затем термин потерь в целевой функции является половиной MSE. loss
возвращает MSE по умолчанию. Поэтому, если вы используете loss
чтобы проверять перезамену (обучение) ошибка, затем существует несоответствие между MSE и результатами оптимизации это fitrlinear
возвращается.
Симулируйте 10 000 наблюдений из этой модели
10000 1000 разреженная матрица с 10%-ми ненулевыми стандартными нормальными элементами.
e является случайной нормальной ошибкой со средним значением 0 и стандартным отклонением 0.3.
rng(1) % For reproducibility
n = 1e4;
d = 1e3;
nz = 0.1;
X = sprandn(n,d,nz);
Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1);
Обучите модель линейной регрессии. Зарезервируйте 30% наблюдений как выборка затяжки.
CVMdl = fitrlinear(X,Y,'Holdout',0.3);
Mdl = CVMdl.Trained{1}
Mdl = RegressionLinear ResponseName: 'Y' ResponseTransform: 'none' Beta: [1000x1 double] Bias: -0.0066 Lambda: 1.4286e-04 Learner: 'svm' Properties, Methods
CVMdl
RegressionPartitionedLinear
модель. Это содержит свойство Trained
, который является массивом ячеек 1 на 1, содержащим RegressionLinear
модель, что программное обеспечение обучило использование набора обучающих данных.
Извлеките обучение и тестовые данные из определения раздела.
trainIdx = training(CVMdl.Partition); testIdx = test(CVMdl.Partition);
Оцените обучение - и демонстрационный тестом MSE.
mseTrain = loss(Mdl,X(trainIdx,:),Y(trainIdx))
mseTrain = 0.1496
mseTest = loss(Mdl,X(testIdx,:),Y(testIdx))
mseTest = 0.1798
Поскольку существует одна сила регуляризации в Mdl
, mseTrain
и mseTest
числовые скаляры.
Симулируйте 10 000 наблюдений из этой модели
10000 1000 разреженная матрица с 10%-ми ненулевыми стандартными нормальными элементами.
e является случайной нормальной ошибкой со средним значением 0 и стандартным отклонением 0.3.
rng(1) % For reproducibility n = 1e4; d = 1e3; nz = 0.1; X = sprandn(n,d,nz); Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1); X = X'; % Put observations in columns for faster training
Обучите модель линейной регрессии. Зарезервируйте 30% наблюдений как выборка затяжки.
CVMdl = fitrlinear(X,Y,'Holdout',0.3,'ObservationsIn','columns'); Mdl = CVMdl.Trained{1}
Mdl = RegressionLinear ResponseName: 'Y' ResponseTransform: 'none' Beta: [1000x1 double] Bias: -0.0066 Lambda: 1.4286e-04 Learner: 'svm' Properties, Methods
CVMdl
RegressionPartitionedLinear
модель. Это содержит свойство Trained
, который является массивом ячеек 1 на 1, содержащим RegressionLinear
модель, что программное обеспечение обучило использование набора обучающих данных.
Извлеките обучение и тестовые данные из определения раздела.
trainIdx = training(CVMdl.Partition); testIdx = test(CVMdl.Partition);
Создайте анонимную функцию, которая измеряет утрату Хубера ( = 1), то есть,
где
невязка для наблюдения j. Пользовательские функции потерь должны быть написаны в конкретной форме. Для правил о записи пользовательской функции потерь смотрите 'LossFun'
аргумент пары "имя-значение".
huberloss = @(Y,Yhat,W)sum(W.*((0.5*(abs(Y-Yhat)<=1).*(Y-Yhat).^2) + ...
((abs(Y-Yhat)>1).*abs(Y-Yhat)-0.5)))/sum(W);
Оцените потерю регрессии набора обучающих данных и набора тестов с помощью функции потерь Хубера.
eTrain = loss(Mdl,X(:,trainIdx),Y(trainIdx),'LossFun',huberloss,... 'ObservationsIn','columns')
eTrain = -0.4186
eTest = loss(Mdl,X(:,testIdx),Y(testIdx),'LossFun',huberloss,... 'ObservationsIn','columns')
eTest = -0.4010
Симулируйте 10 000 наблюдений из этой модели
10000 1000 разреженная матрица с 10%-ми ненулевыми стандартными нормальными элементами.
e является случайной нормальной ошибкой со средним значением 0 и стандартным отклонением 0.3.
rng(1) % For reproducibility
n = 1e4;
d = 1e3;
nz = 0.1;
X = sprandn(n,d,nz);
Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1);
Создайте набор 15 логарифмически распределенных сильных мест регуляризации от через .
Lambda = logspace(-4,-1,15);
Протяните 30% данных для тестирования. Идентифицируйте демонстрационные тестом индексы.
cvp = cvpartition(numel(Y),'Holdout',0.30);
idxTest = test(cvp);
Обучите модель линейной регрессии, использующую штрафы лассо с сильными местами в Lambda
. Задайте сильные места регуляризации, оптимизировав использование целевой функции SpaRSA и раздел данных. Чтобы увеличить скорость выполнения, транспонируйте данные о предикторе и укажите, что наблюдения находятся в столбцах.
X = X'; CVMdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,... 'Solver','sparsa','Regularization','lasso','CVPartition',cvp); Mdl1 = CVMdl.Trained{1}; numel(Mdl1.Lambda)
ans = 15
Mdl1
RegressionLinear
модель. Поскольку Lambda
15-мерный вектор из сильных мест регуляризации, можно думать о Mdl1
как 15 обученных моделей, один для каждой силы регуляризации.
Оцените демонстрационную тестом среднеквадратическую ошибку для каждой упорядоченной модели.
mse = loss(Mdl1,X(:,idxTest),Y(idxTest),'ObservationsIn','columns');
Более высокие значения Lambda
приведите к разреженности переменного предиктора, которая является хорошим качеством модели регрессии. Переобучите модель с помощью целого набора данных и всех опций, используемых ранее, кроме спецификации раздела данных. Определите количество ненулевых коэффициентов на модель.
Mdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,... 'Solver','sparsa','Regularization','lasso'); numNZCoeff = sum(Mdl.Beta~=0);
На том же рисунке постройте MSE и частоту ненулевых коэффициентов для каждой силы регуляризации. Постройте все переменные на логарифмической шкале.
figure; [h,hL1,hL2] = plotyy(log10(Lambda),log10(mse),... log10(Lambda),log10(numNZCoeff)); hL1.Marker = 'o'; hL2.Marker = 'o'; ylabel(h(1),'log_{10} MSE') ylabel(h(2),'log_{10} nonzero-coefficient frequency') xlabel('log_{10} Lambda') hold off
Выберите индекс или индексы Lambda
тот баланс минимальная ошибка классификации и разреженность переменного предиктора (например, Lambda(11)
).
idx = 11; MdlFinal = selectModels(Mdl,idx);
MdlFinal
обученный RegressionLinear
объект модели, который использует Lambda(11)
как сила регуляризации.
Указания и ограничения по применению:
loss
не поддерживает высокий table
данные.
Для получения дополнительной информации см. Раздел "Высокие массивы".
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.