Класс: 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.