Класс: 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'Размерность наблюдения данных предиктора, заданная как 'rows' или 'columns'.
Примечание
Если вы ориентируете матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задавали 'ObservationsIn','columns', тогда вы можете испытать значительное сокращение времени расчета. Вы не можете задать 'ObservationsIn','columns' для данных предиктора в таблице.
Типы данных: char | string
'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 возвращает.
Симулируйте 10000 наблюдений из этой модели
является разреженной матрицей 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 являются числовыми скалярами.
Симулируйте 10000 наблюдений из этой модели
является разреженной матрицей 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);
Создайте анонимную функцию, которая измеряет потерю Huber ( = 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);Оцените набор обучающих данных и тестовый набор регрессионных потерь с помощью функции потерь Huber.
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
Симулируйте 10000 наблюдений из этой модели
является разреженной матрицей 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);Обучите линейную регрессионую модель, используя штрафы lasso с сильными сторонами в 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.