kfoldLoss

Регрессионые потери для наблюдений, не используемых в обучении

Описание

Описание

пример

L = kfoldLoss(CVMdl) возвращает перекрестно проверенную среднюю квадратичную невязку (MSE), полученную перекрестно проверенной линейной регрессионой моделью CVMdl. То есть для каждой складки kfoldLoss оценивает регрессионные потери для наблюдений, которые он выполняет, когда обучается, используя все другие наблюдения.

L содержит регрессионные потери для каждой силы регуляризации в линейных регрессионых моделях, которые составляют CVMdl.

пример

L = kfoldLoss(CVMdl,Name,Value) использует дополнительные опции, заданные одним или несколькими Name,Value аргументы в виде пар. Для примера укажите, какие складки использовать для вычисления потерь или укажите функцию регрессии-потерь.

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

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

Перекрестная проверенная линейная регрессионая модель, заданная как RegressionPartitionedLinear объект модели. Можно создать RegressionPartitionedLinear модель с использованием fitrlinear и определение любого из аргументов пары "имя-значение", например CrossVal.

Чтобы получить оценки, kfoldLoss применяет те же данные, что и для перекрестной валидации модели линейной регрессии (X и Y).

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

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Индексы сгиба для использования в предсказании отклика, заданные как разделенная разделенными запятой парами, состоящая из 'Folds' и числовой вектор положительных целых чисел. Элементы Folds должен варьироваться от 1 через CVMdl.KFold.

Пример: 'Folds',[1 4 10]

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

Функция потерь, заданная как разделенная разделенными запятой парами, состоящая из '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-мерный вектор наблюдаемых откликов. kfoldLoss передает входной параметр Y в для Y.

    • Yhat является n-мерный вектор предсказанных откликов, подобный выходу predict.

    • W является n-by-1 числовой вектор весов наблюдений.

    Задайте свою функцию, используя 'LossFun', @ lossfun.

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

Уровень агрегирования потерь, заданный как разделенная разделенными запятой парами, состоящая из 'Mode' и 'average' или 'individual'.

ЗначениеОписание
'average'Возвращает потери, усредненные по всем складкам
'individual'Возвращает потери для каждой складки

Пример: 'Mode','individual'

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

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

Перекрестно проверенные регрессионные потери, возвращенные как числовой скаляр, вектор или матрица. Толкование L зависит от LossFun.

Позвольте R быть количеством сильных сторон регуляризации является перекрестно проверенные модели (хранятся в numel(CVMdl.Trained{1}.Lambda)) и F количество складок (сохранено в CVMdl.KFold).

  • Если Mode является 'average', затем L является 1-байт- R вектор. L (j) - средняя регрессионная потеря по всем складкам перекрестно проверенной модели, которая использует силу регуляризации j.

  • В противном случае L является F-by- R матрица. L (i, j) - регрессионные потери для складки i модели с перекрестной проверкой, которая использует силу регуляризации j.

Для оценки L, kfoldLoss использует данные, которые создали CVMdl (см. X и Y).

Примеры

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

Симулируйте 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);

Перекрестная валидация линейной регрессионой модели с помощью SVM-учащихся.

rng(1); % For reproducibility 
CVMdl = fitrlinear(X,Y,'CrossVal','on');

CVMdl является RegressionPartitionedLinear модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную валидацию. Вы можете изменить количество складок, используя 'KFold' аргумент пары "имя-значение".

Оцените среднее значение MSE тестовой выборки.

mse = kfoldLoss(CVMdl)
mse = 0.1735

Кроме того, можно получить MSE в относительных точках путем определения пары "имя-значение" 'Mode','individual' в kfoldLoss.

Моделируйте данные как в Estimate k-Fold Mean Квадратичная Невязка.

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 

Перекрестная валидация линейной регрессионной модели с помощью 10-кратной перекрестной валидации. Оптимизируйте целевую функцию с помощью SpaRSA.

CVMdl = fitrlinear(X,Y,'CrossVal','on','ObservationsIn','columns',...
    'Solver','sparsa');

CVMdl является RegressionPartitionedLinear модель. Оно содержит свойство Trained, который является массивом ячеек 10 на 1, удерживающим RegressionLinear Модели, что программное обеспечение обучалось с использованием набора обучающих данных.

Создайте анонимную функцию, которая измеряет потерю 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 по складкам. Также получите потери Huber для каждой складки.

mseAve = kfoldLoss(CVMdl,'LossFun',huberloss)
mseAve = -0.4447
mseFold = kfoldLoss(CVMdl,'LossFun',huberloss,'Mode','individual')
mseFold = 10×1

   -0.4454
   -0.4473
   -0.4452
   -0.4469
   -0.4434
   -0.4427
   -0.4471
   -0.4430
   -0.4438
   -0.4426

Чтобы определить хорошую силу лассо-штрафа для линейной регрессионой модели, которая использует методом наименьших квадратов, реализуйте 5-кратную перекрестную валидацию.

Симулируйте 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-5 через 10-1.

Lambda = logspace(-5,-1,15);

Перекрестная проверка моделей. Чтобы увеличить скорость выполнения, транспонируйте данные предиктора и укажите, что наблюдения указаны в столбцах. Оптимизируйте целевую функцию с помощью SpaRSA.

X = X'; 
CVMdl = fitrlinear(X,Y,'ObservationsIn','columns','KFold',5,'Lambda',Lambda,...
    'Learner','leastsquares','Solver','sparsa','Regularization','lasso');

numCLModels = numel(CVMdl.Trained)
numCLModels = 5

CVMdl является RegressionPartitionedLinear модель. Потому что fitrlinear реализует 5-кратную перекрестную валидацию, CVMdl содержит 5 RegressionLinear модели, которые программное обеспечение обучает на каждой складке.

Отобразите первую обученную линейную регрессионую модель.

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [1000x15 double]
                 Bias: [1x15 double]
               Lambda: [1x15 double]
              Learner: 'leastsquares'


  Properties, Methods

Mdl1 является RegressionLinear объект модели. fitrlinear построенные Mdl1 путем обучения на первых четырех складках. Потому что Lambda последовательность регуляризационных сильных сторон, вы можете думать о Mdl1 как 15 моделей, по одной на каждую силу регуляризации в Lambda.

Оцените перекрестно проверенный MSE.

mse = kfoldLoss(CVMdl);

Более высокие значения Lambda привести к разреженности переменной предиктора, которая является хорошим качеством регрессионой модели. Для каждой силы регуляризации обучите линейную регрессионую модель, используя весь набор данных и те же опции, что и при перекрестной проверке моделей. Определите количество ненулевых коэффициентов на модель.

Mdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,...
    'Learner','leastsquares','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.

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

idxFinal = 10;

Извлеките модель с соответствующим минимальным MSE.

MdlFinal = selectModels(Mdl,idxFinal)
MdlFinal = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [1000x1 double]
                 Bias: -0.0050
               Lambda: 0.0037
              Learner: 'leastsquares'


  Properties, Methods

idxNZCoeff = find(MdlFinal.Beta~=0)
idxNZCoeff = 2×1

   100
   200

EstCoeff = Mdl.Beta(idxNZCoeff)
EstCoeff = 2×1

    1.0051
    1.9965

MdlFinal является RegressionLinear модель с одной силой регуляризации. Ненулевые коэффициенты EstCoeff близки к коэффициентам, которые моделировали данные.

Введенный в R2016a