loss

Класс: RegressionLinear

Регрессионые потери для линейных регрессионых моделей

Описание

пример

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

L = loss(Mdl,Tbl,ResponseVarName) возвращает MSE для данных предиктора в Tbl и истинные ответы в Tbl.ResponseVarName.

L = loss(Mdl,Tbl,Y) возвращает MSE для данных предиктора в таблице Tbl и истинные ответы в Y.

пример

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

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

расширить все

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

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

Примечание

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

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

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

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

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

Выборочные данные, используемых для обучения модели, заданная как таблица. Каждая строка Tbl соответствует одному наблюдению, и каждый столбец соответствует одной переменной предиктора. Опционально Tbl может содержать дополнительные столбцы для переменной отклика и весов наблюдений. Tbl должны содержать все предикторы, используемые для обучения Mdl. Многополюсные переменные и массивы ячеек, отличные от массивов ячеек векторов символов, не разрешены.

Если Tbl содержит переменную отклика, используемую для обучения Mdl, тогда вам не нужно указывать ResponseVarName или Y.

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

Имя переменной отклика, заданное как имя переменной в Tbl. Переменная отклика должна быть числовым вектором.

Если вы задаете ResponseVarName, затем необходимо задать его как вектор символов или строковый скаляр. Для примера, если переменная отклика сохранена как Tbl.Y, затем задайте ResponseVarName как 'Y'. В противном случае программное обеспечение обрабатывает все столбцы Tbl, включая Tbl.Y, как предикторы.

Типы данных: char | string

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

Задайте необязательные разделенные разделенными запятой парами 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

Размерность наблюдения данных предиктора, заданная как 'rows' или 'columns'.

Примечание

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

Типы данных: char | string

Веса наблюдений, заданные как разделенная разделенными запятой парами, состоящая из 'Weights' и числовой вектор или имя переменной в Tbl.

  • Если вы задаете Weights в виде числового вектора, затем размера Weights должно быть равно количеству наблюдений в X или Tbl.

  • Если вы задаете Weights как имя переменной в Tbl, тогда имя должно быть вектором символов или строковым скаляром. Для примера, если веса сохранены как Tbl.W, затем задайте Weights как 'W'. В противном случае программное обеспечение обрабатывает все столбцы Tbl, включая Tbl.W, как предикторы.

Если вы поставляете веса, loss вычисляет взвешенные потери регрессии и нормализует Weights в сумму до 1.

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

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

расширить все

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

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

Примечание

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

Примеры

расширить все

Симулируйте 10000 наблюдений из этой модели

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 являются числовыми скалярами.

Симулируйте 10000 наблюдений из этой модели

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);

Создайте анонимную функцию, которая измеряет потерю Huber (δ = 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);

Оцените набор обучающих данных и тестовый набор регрессионных потерь с помощью функции потерь 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 наблюдений из этой модели

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);

Обучите линейную регрессионую модель, используя штрафы 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

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line.

Выберите индекс или индексы Lambda которые балансируют минимальную ошибку классификации и разреженность с переменной предиктора (для примера, Lambda(11)).

idx = 11;
MdlFinal = selectModels(Mdl,idx);

MdlFinal является обученным RegressionLinear объект модели, который использует Lambda(11) как прочность на регуляризацию.

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

См. также

| |

Введенный в R2016a