loss

Класс: RegressionLinear

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

Описание

пример

L = loss(Mdl,X,Y) возвращает среднеквадратическую ошибку (MSE) для модели Mdl линейной регрессии использование данных о предикторе в X и соответствующие ответы в YL содержит 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 имя аргумента и 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 единицы (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