Этот пример показывает, как 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. Слева, большое значение Lambda заставляет все кроме одного коэффициента быть 0. Справа все пять коэффициентов являются ненулевыми, хотя график показывает только два ясно. Другие три коэффициента являются столь маленькими, что вы не можете визуально отличить их от 0.
Для маленьких значений Lambda (к праву в графике), содействующие значения близко к оценке наименьших квадратов.
Найдите значение 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)
имеет только два ненулевых компонента, и поэтому может обеспечить лучшие прогнозирующие оценки на новых данных.