Этот пример показывает, как lasso
определяет и отбрасывает ненужные предикторы.
Сгенерируйте 200 выборок пятимерных искусственных данных X из экспоненциальных распределений различными средствами.
rng(3,'twister') % For reproducibility X = zeros(200,5); for ii = 1:5 X(:,ii) = exprnd(ii,200,1); end
Сгенерируйте данные отклика Y
= X
* r
+ eps
, где r
имеет всего два ненулевых компонента и eps шума
норма со стандартным отклонением 0,1.
r = [0;2;0;-3;0]; Y = X*r + randn(200,1)*.1;
Подбор перекрестно проверенной последовательности моделей с lasso
, и постройте график результата.
[b,fitinfo] = lasso(X,Y,'CV',10); lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');
График показывает ненулевые коэффициенты в регрессии для различных значений Lambda
параметр регуляризации. Большие значения Lambda
появится в левой части графика, что означает большую регуляризацию, что приводит к меньшему количеству ненулевых коэффициентов регрессии.
Штриховые вертикальные линии представляют Lambda
значение с минимальной средней квадратичной невязкой (справа) и Lambda
значение с минимальной средней квадратичной невязкой плюс одно стандартное отклонение. Это последнее значение является рекомендуемой настройкой для Lambda
. Эти линии появляются только при выполнении перекрестной валидации. Перекрестная проверка путем установки 'CV'
аргумент пары "имя-значение". В этом примере используется 10-кратная перекрестная валидация.
Верхняя часть графика показывает степени свободы (df), означающие количество ненулевых коэффициентов в регрессии, как функцию Лямбды. Слева, большое значение Lambda заставляет все коэффициенты, кроме одного, быть 0. Справа все пять коэффициентов ненулевые, хотя график показывает только два четко. Другие три коэффициента настолько малы, что вы не можете визуально отличить их от 0.
Для небольших значений Лямбды (справа на графике) значения коэффициентов близки к оценке методом наименьших квадратов.
Найдите Lambda
значение минимальной перекрестной подтвержденной средней квадратичной невязки плюс одно стандартное отклонение. Исследуйте MSE и коэффициенты подгонки в этой Lambda
.
lam = fitinfo.Index1SE; fitinfo.MSE(lam)
ans = 0.1398
b(:,lam)
ans = 5×1
0
1.8855
0
-2.9367
0
lasso
хорошо справился с поиском вектора коэффициентов r
.
Для сравнения найдите оценку методом наименьших квадратов r
.
rhat = X\Y
rhat = 5×1
-0.0038
1.9952
0.0014
-2.9993
0.0031
Оценка b(:,lam)
имеет немного большую среднюю квадратичную невязку, чем средняя квадратичная невязка rhat
.
res = X*rhat - Y; % Calculate residuals MSEmin = res'*res/200 % b(:,lam) value is 0.1398
MSEmin = 0.0088
Но b(:,lam)
имеет только два ненулевых компонента, и поэтому может предоставить лучшие прогнозные оценки новых данных.
fitrlinear
| lasso
| lassoglm
| lassoPlot
| ridge