потеря

Класс: RegressionLinear

Потеря регрессии для моделей линейной регрессии

Синтаксис

L = loss(Mdl,X,Y)
L = loss(___,Name,Value)

Описание

пример

L = loss(Mdl,X,Y) возвращает среднеквадратическую ошибку (MSE) для модели Mdl линейной регрессии с помощью данных о предикторе в X и соответствующих ответов в Y. L содержит MSE для каждой силы регуляризации в Mdl.

пример

L = loss(___,Name,Value) использование любой из предыдущих синтаксисов и дополнительных опций задано одним или несколькими аргументами пары Name,Value. Например, укажите, что столбцы в данных о предикторе соответствуют наблюдениям или задают функцию потерь регрессии.

Входные параметры

развернуть все

Модель линейной регрессии, заданная как объект модели RegressionLinear. Можно создать объект модели RegressionLinear с помощью fitrlinear.

Данные о предикторе, заданные как n-by-p полная или разреженная матрица. Эта ориентация X указывает, что строки соответствуют отдельным наблюдениям, и столбцы соответствуют отдельным переменным прогноза.

Примечание

Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns', то вы можете испытать значительное сокращение во время вычисления.

Длина Y и количество наблюдений в X должны быть равными.

Типы данных: single | double

Данные об ответе, заданные как n - размерный числовой вектор. Длина Y и количество наблюдений в X должны быть равными.

Типы данных: single | double

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Функция потерь, заданная как пара, разделенная запятой, состоящая из 'LossFun' и встроенного имени функции потерь или указателя на функцию.

  • В следующей таблице перечислены доступные функции потерь. Задайте тот с помощью его соответствующего значения. Кроме того, в таблице, f(x)=xβ+b.

    • β является вектором коэффициентов p.

    • x является наблюдением от переменных прогноза p.

    • b является скалярным смещением.

    ЗначениеОписание
    'epsiloninsensitive'Нечувствительная к эпсилону потеря: [y,f(x)]=max [0,|yf(x)|ε]
    'mse'MSE: [y,f(x)]=[yf(x)]2

    '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' и 'columns' или 'rows'.

Примечание

Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns', то вы можете испытать значительное сокращение во время выполнения оптимизации.

Веса наблюдения, заданные как пара, разделенная запятой, состоящая из 'Weights' и числовой вектор положительных значений. Если вы предоставляете веса, loss вычисляет взвешенную потерю классификации.

Позвольте n быть количеством наблюдений в X.

  • numel(Weights) должен быть n.

  • По умолчанию Weights является ones(n,1).

Типы данных: double | single

Выходные аргументы

развернуть все

Потери регрессии, возвращенные в виде числа или вектора - строки. Интерпретация L зависит от Weights и LossFun.

L одного размера как Mdl.Lambda. L(j) является потерей регрессии модели линейной регрессии, обученной с помощью силы регуляризации Mdl.Lambda(j).

Примечание

Если Mdl.FittedLoss является 'mse', то термин потерь в целевой функции является половиной MSE. loss возвращает MSE по умолчанию. Поэтому, если вы используете loss, чтобы проверять перезамену (обучение) ошибка, затем существует несоответствие между MSE и результатами оптимизации, которые возвращает fitrlinear.

Примеры

развернуть все

Моделируйте 10 000 наблюдений из этой модели

y=x100+2x200+e.

  • X=x1,...,x1000 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 наблюдений из этой модели

y=x100+2x200+e.

  • X=x1,...,x1000 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), то есть,

L=1wjj=1nwjj,

где

j={0.5ejˆ2;|ejˆ|-0.5;|ejˆ|1|ejˆ|>1.

ejˆ невязка для наблюдения 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 наблюдений из этой модели

y=x100+2x200+e.

  • X={x1,...,x1000} 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 логарифмически распределенных сильных мест регуляризации от 10-4 через 10-1.

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) в качестве силы регуляризации.

Расширенные возможности

Смотрите также

| |

Введенный в R2016a