В этом примере показано, как использовать lasso
наряду с перекрестной валидацией для идентификации важных предикторов.
Загрузите выборочные данные и отобразите описание.
load spectra
Description
Description = 11×72 char array '== Spectral and octane data of gasoline == ' ' ' 'NIR spectra and octane numbers of 60 gasoline samples ' ' ' 'NIR: NIR spectra, measured in 2 nm intervals from 900 nm to 1700 nm ' 'octane: octane numbers ' 'spectra: a dataset array containing variables for NIR and octane ' ' ' 'Reference: ' 'Kalivas, John H., "Two Data Sets of Near Infrared Spectra," Chemometrics' 'and Intelligent Laboratory Systems, v.37 (1997) pp.255-259 '
Лассо и эластичная сеть особенно хорошо подходят для широких данных, то есть данных с большим количеством предикторов, чем наблюдения с лассо и эластичной сеткой. В этом типе данных есть избыточные предикторы. Можно использовать lasso
наряду с перекрестной валидацией для идентификации важных предикторов.
Вычислите значение по умолчанию lasso
подгонка.
[b fitinfo] = lasso(NIR,octane);
Постройте график количества предикторов в установленной регуляризации лассо как функции Lambda
, используя логарифмическую ось X.
lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');
Трудно сказать, какое значение Lambda
уместно. Чтобы определить хорошее значение, попробуйте подгонку с перекрестной валидацией.
tic
[b fitinfo] = lasso(NIR,octane,'CV',10);
toc
Elapsed time is 7.353767 seconds.
Постройте график результата.
lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');
Отобразите предлагаемое значение Lambda
.
fitinfo.Lambda1SE
ans = 0.0302
Отобразите Lambda
с минимальным MSE.
fitinfo.LambdaMinMSE
ans = 0.0144
Исследуйте качество подгонки для предлагаемого значения Lambda
.
lambdaindex = fitinfo.Index1SE; mse = fitinfo.MSE(lambdaindex) df = fitinfo.DF(lambdaindex)
mse = 0.0528 df = 11
Подгонка использует всего 11 из 401 предикторов и достигает небольшой перекрестной проверки MSE.
Исследуйте график перекрестного проверки MSE.
lassoPlot(b,fitinfo,'PlotType','CV'); % Use a log scale for MSE to see small MSE values better set(gca,'YScale','log');
Как Lambda
увеличивается (налево), быстро увеличивается MSE. Коэффициенты уменьшаются слишком много, и они не адекватно соответствуют ответам. Как Lambda
уменьшается, модели больше (имеют больше ненулевых коэффициентов). Увеличение MSE предполагает, что модели переоборудованы.
Набор по умолчанию Lambda
значения не включают значения, достаточно маленькие, чтобы включать все предикторы. В этом случае, по-видимому, нет причины смотреть на меньшие значения. Однако, если вы хотите получить меньшие значения, чем по умолчанию, используйте LambdaRatio
параметр, или поставьте последовательность Lambda
значения с использованием Lambda
параметр. Для получения дополнительной информации смотрите lasso
страница с описанием.
Перекрестная валидация может быть медленной. Если у вас есть лицензия Parallel Computing Toolbox, ускорите расчет перекрестно проверенной оценки лассо с помощью параллельных вычислений. Запустите параллельный пул.
mypool = parpool()
Starting parallel pool (parpool) using the 'local' profile ... connected to 6 workers. mypool = Pool with properties: Connected: true NumWorkers: 6 Cluster: local AttachedFiles: {} AutoAddClientPath: true IdleTimeout: 30 minutes (30 minutes remaining) SpmdEnabled: true
Установите опцию параллельных вычислений и вычислите оценку лассо.
opts = statset('UseParallel',true); tic; [b fitinfo] = lasso(NIR,octane,'CV',10,'Options',opts); toc
Elapsed time is 3.799009 seconds.
Параллельные вычисления с использованием двух рабочих процессов позволяют быстрее решить эту задачу.
Остановите параллельный пул.
delete(mypool)
Parallel pool using the 'local' profile is shutting down.
fitrlinear
| lasso
| lassoglm
| lassoPlot
| ridge