Этот пример показывает, как выполнить выбор переменной при помощи Байесовой регрессии лассо.
Регрессия лассо является методом линейной регрессии, который комбинирует регуляризацию и выбор переменной. Регуляризация помогает предотвратить сверхподбор кривой путем уменьшения значения коэффициентов регрессии. Частотное представление регрессии лассо отличается от того из других методов регуляризации, такой как, гребенчатая регрессия, потому что лассо приписывает значение точно 0 к коэффициентам регрессии, соответствующим предикторам, которые незначительны или избыточны.
Считайте это несколькими модель линейной регрессии:

вектор n ответов.
матрица p соответствующих наблюдаемых переменных прогноза.
вектор p коэффициентов регрессии.
прерывание.
длина n вектор-столбец из единиц.
случайный вектор iid Гауссовых воздействий со средним значением 0 и отклонением
.
Целевая функция частотного представления регрессии лассо

штраф (или уменьшение) термин и, в отличие от других параметров, не является подходящим к данным. Необходимо задать значение для
перед оценкой, и лучшая практика состоит в том, чтобы настроить ее. После того, как вы зададите значение,
минимизирован относительно коэффициентов регрессии. Получившиеся коэффициенты являются оценками лассо. Для получения дополнительной информации на частотном представлении регрессии лассо, см. [108].
В данном примере рассмотрите создание прогнозирующей линейной модели для уровня безработицы США. Вы хотите модель, которая делает вывод хорошо. Другими словами, вы хотите минимизировать сложность модели путем удаления всех избыточных предикторов и всех предикторов, которые являются некоррелироваными с уровнем безработицы.
Загрузите США макроэкономический набор данных Data_USEconModel.mat.
load Data_USEconModel
Набор данных включает расписание MATLAB® DataTable, который содержит 14 переменных, измеренных от 1 квартала 1947 до 1 квартала 2009; UNRATE является уровнем безработицы США. Для получения дополнительной информации введите Description в командной строке.
Постройте весь ряд в той же фигуре, но в отдельных подграфиках.
figure; for j = 1:size(DataTable,2) subplot(4,4,j) plot(DataTable.Time,DataTable{:,j}); title(DataTable.Properties.VariableNames(j)); end

Все ряды кроме FEDFUNDS, GS10, TB3MS и UNRATE, кажется, имеют экспоненциальный тренд.
Применяйте логарифмическое преобразование к тем переменным, которые имеют экспоненциальный тренд.
hasexpotrend = ~ismember(DataTable.Properties.VariableNames,... ["FEDFUNDS" "GD10" "TB3MS" "UNRATE"]); DataTableLog = varfun(@log,DataTable,'InputVariables',... DataTable.Properties.VariableNames(hasexpotrend)); DataTableLog = [DataTableLog DataTable(:,DataTable.Properties.VariableNames(~hasexpotrend))];
DataTableLog является расписанием как DataTable, но те переменные с экспоненциальным трендом находятся на логарифмической шкале.
Коэффициенты, которые имеют относительно большие значения, имеют тенденцию доминировать над штрафом в целевой функции регрессии лассо. Поэтому важно, чтобы переменные имели подобную шкалу, когда вы реализуете регрессию лассо. Сравните шкалы переменных в DataTableLog путем графического вывода их диаграмм на той же оси.
figure; boxplot(DataTableLog.Variables,'Labels',DataTableLog.Properties.VariableNames); h = gcf; h.Position(3) = h.Position(3)*2.5; title('Variable Box Plots');

Переменные имеют довольно подобные шкалы.
Чтобы определить, как хорошо модели временных рядов делают вывод, выполните эту процедуру:
Разделите данные в оценку и предскажите выборки.
Соответствуйте моделям к выборке оценки.
Используйте подобранные модели, чтобы предсказать ответы в горизонт прогноза.
Оцените среднеквадратическую ошибку прогноза (FMSE) для каждой модели.
Выберите модель с самым низким FMSE.
Создайте оценку и предскажите демонстрационные переменные для данных о предикторе и ответа. Задайте горизонт прогноза 4 лет (16 четвертей).
fh = 16; y = DataTableLog.UNRATE(1:(end - fh)); yF = DataTableLog.UNRATE((end - fh + 1):end); isresponse = DataTable.Properties.VariableNames == "UNRATE"; X = DataTableLog{1:(end - fh),~isresponse}; XF = DataTableLog{(end - fh + 1):end,~isresponse}; p = size(X,2); % Number of predictors predictornames = DataTableLog.Properties.VariableNames(~isresponse);
Соответствуйте простой модели линейной регрессии к выборке оценки. Задайте имена переменных (имя переменной отклика должно быть последним элементом). Извлеките p-значения. Идентифицируйте незначительные коэффициенты при помощи 5%-го уровня значения.
SLRMdlFull = fitlm(X,y,'VarNames',DataTableLog.Properties.VariableNames)
slrPValue = SLRMdlFull.Coefficients.pValue;
isInSig = SLRMdlFull.CoefficientNames(slrPValue > 0.05)
SLRMdlFull =
Linear regression model:
UNRATE ~ [Linear formula with 14 terms in 13 predictors]
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ _______ __________
(Intercept) 88.014 5.3229 16.535 2.6568e-37
log_COE 7.1111 2.3426 3.0356 0.0027764
log_CPIAUCSL -3.4032 2.4611 -1.3828 0.16853
log_GCE -5.63 1.1581 -4.8615 2.6245e-06
log_GDP 14.522 3.9406 3.6851 0.00030659
log_GDPDEF 11.926 2.9298 4.0704 7.1598e-05
log_GPDI -2.5939 0.54603 -4.7504 4.2792e-06
log_GS10 0.57467 0.29313 1.9605 0.051565
log_HOANBS -32.861 1.4507 -22.652 2.3116e-53
log_M1SL -3.3023 0.53185 -6.209 3.914e-09
log_M2SL -1.3845 1.0438 -1.3264 0.18647
log_PCEC -7.143 3.4302 -2.0824 0.038799
FEDFUNDS 0.044542 0.047747 0.93287 0.3522
TB3MS -0.1577 0.064421 -2.448 0.015375
Number of observations: 185, Error degrees of freedom: 171
Root Mean Squared Error: 0.312
R-squared: 0.957, Adjusted R-Squared: 0.954
F-statistic vs. constant model: 292, p-value = 2.26e-109
isInSig =
1x4 cell array
{'log_CPIAUCSL'} {'log_GS10'} {'log_M2SL'} {'FEDFUNDS'}
SLRMdlFull является объектом модели LinearModel. P-значения предполагают, что на 5%-м уровне значения CPIAUCSL, GS10, M2SL и FEDFUNDS являются незначительными переменными.
Переоборудуйте линейную модель без незначительных переменных в данных о предикторе. Используя полные и упрощенные модели, предскажите уровень безработицы в горизонт прогноза, затем оцените FMSEs.
idxreduced = ~ismember(predictornames,isInSig); XReduced = X(:,idxreduced); SLRMdlReduced = fitlm(XReduced,y,'VarNames',[predictornames(idxreduced) {'UNRATE'}]); yFSLRF = predict(SLRMdlFull,XF); yFSLRR = predict(SLRMdlReduced,XF(:,idxreduced)); fmseSLRF = sqrt(mean((yF - yFSLRF).^2)) fmseSLRR = sqrt(mean((yF - yFSLRR).^2))
fmseSLRF =
0.6674
fmseSLRR =
0.6105
FMSE упрощенной модели является меньше, чем FMSE полной модели, которая предполагает, что упрощенная модель делает вывод лучше.
Соответствуйте модели регрессии лассо к данным. Используйте путь к регуляризации по умолчанию. lasso стандартизирует данные по умолчанию. Поскольку переменные находятся в подобных шкалах, не стандартизируйте их. Возвратите информацию о подгонках вдоль пути к регуляризации.
[LassoBetaEstimates,FitInfo] = lasso(X,y,'Standardize',false,... 'PredictorNames',predictornames);
По умолчанию lasso соответствует временам модели 100 регрессии лассо при помощи последовательности значений для
. Поэтому LassoBetaEstimates 13 100 матрица оценок коэффициента регрессии. Строки соответствуют переменным прогноза в X, и столбцы соответствуют значениям
. FitInfo является структурой, которая включает значения
(FitInfo.Lambda), среднеквадратической ошибки для каждой подгонки (FitInfo.MSE) и предполагаемые прерывания (FitInfo.Intercept).
Вычислите FMSE каждой модели, возвращенной lasso.
yFLasso = FitInfo.Intercept + XF*LassoBetaEstimates; fmseLasso = sqrt(mean((yF - yFLasso).^2,1));
Постройте значение коэффициентов регрессии относительно значения уменьшения.
figure; hax = lassoPlot(LassoBetaEstimates,FitInfo); L1Vals = hax.Children.XData; yyaxis right h = plot(L1Vals,fmseLasso,'LineWidth',2,'LineStyle','--'); legend(h,'FMSE','Location','SW'); ylabel('FMSE'); title('Frequentist Lasso')


Модель с 7 предикторами (df = 7), кажется, балансирует минимальный FMSE и сложность модели хорошо. Получите коэффициенты, соответствующие модели, содержащей 7 предикторов и приводящей к минимальному FMSE.
fmsebestlasso = min(fmseLasso(FitInfo.DF == 7)); idx = fmseLasso == fmsebestlasso; bestLasso = [FitInfo.Intercept(idx); LassoBetaEstimates(:,idx)]; table(bestLasso,'RowNames',["Intercept" predictornames])
ans =
14x1 table
bestLasso
_________
Intercept 61.154
log_COE 0.042061
log_CPIAUCSL 0
log_GCE 0
log_GDP 0
log_GDPDEF 8.524
log_GPDI 0
log_GS10 1.6957
log_HOANBS -18.937
log_M1SL -1.3365
log_M2SL 0.17948
log_PCEC 0
FEDFUNDS 0
TB3MS -0.14459
Частотный анализ лассо предполагает, что переменные CPIAUCSL, GCE, GDP, GPDI, PCEC и FEDFUNDS или незначительны или избыточны.
В представлении Bayesian регрессии лассо предшествующим распределением коэффициентов регрессии является Лаплас (удвойте экспоненциал), со средним значением 0 и шкалой
, где
фиксированный параметр уменьшения и
. Для получения дополнительной информации смотрите lassoblm.
Как с частотным представлением регрессии лассо, если вы увеличиваетесь
, затем разреженность получившейся модели увеличивается монотонно. Однако различающееся частотное лассо, Байесово лассо имеет незначительные или избыточные содействующие режимы, которые не являются точно 0. Вместо этого оценки имеют апостериорное распределение и незначительны или избыточны, если область приблизительно 0 имеют высокую плотность.
Когда вы реализуете Байесовую регрессию лассо в MATLAB®, знать о нескольких различиях между Statistics and Machine Learning Toolbox™ функционируют lasso и объект Econometrics Toolbox™ lassoblm и его присоединенные функции.
lassoblm является частью объектной среды, тогда как lasso является функцией. Объектная среда оптимизировала эконометрические рабочие процессы.
В отличие от lasso, lassoblm не стандартизирует данные о предикторе. Однако можно предоставить различные значения уменьшения для каждого коэффициента. Эта функция помогает поддержать interpretability содействующих оценок.
lassoblm применяет одно значение уменьшения к каждому коэффициенту; это не принимает путь к регуляризации как lasso.
Поскольку среда lassoblm подходит для выполнения Байесовой регрессии лассо для одного значения уменьшения на коэффициент, можно использовать цикл for, чтобы выполнить лассо по пути к регуляризации.
Создайте Байесовую регрессию лассо предшествующая модель при помощи bayeslm. Задайте количество переменных прогноза и имен переменных. Отобразите значение уменьшения по умолчанию для каждого коэффициента, сохраненного в свойстве Lambda модели.
PriorMdl = bayeslm(p,'ModelType','lasso','VarNames',predictornames); table(PriorMdl.Lambda,'RowNames',PriorMdl.VarNames)
ans =
14x1 table
Var1
____
Intercept 0.01
log_COE 1
log_CPIAUCSL 1
log_GCE 1
log_GDP 1
log_GDPDEF 1
log_GPDI 1
log_GS10 1
log_HOANBS 1
log_M1SL 1
log_M2SL 1
log_PCEC 1
FEDFUNDS 1
TB3MS 1
PriorMdl является объектом модели lassoblm. lassoblm приписывает уменьшение 1 для каждого коэффициента кроме прерывания, которое имеет уменьшение 0.01. Эти значения по умолчанию не могут быть полезными в большинстве приложений; лучшая практика состоит в том, чтобы экспериментировать со многими значениями.
Считайте путь к регуляризации возвращенным lasso. Раздуйте значения уменьшения фактором
, куда
MSE лассо запущен
,
= 1 через количество значений уменьшения.
ismissing = any(isnan(X),2);
n = sum(~ismissing); % Effective sample size
lambda = FitInfo.Lambda*n./sqrt(FitInfo.MSE);
Считайте путь к регуляризации возвращенным lasso. Цикл через значения уменьшения в каждой итерации:
Оцените апостериорные распределения коэффициентов регрессии и отклонения воздействия, учитывая уменьшение и данные. Поскольку шкалы предикторов близки, приписывают то же уменьшение каждому предиктору и приписывают уменьшение 0.01 к прерыванию. Сохраните следующие средние значения и 95%-е вероятные интервалы.
Для графика лассо, если 95%-й вероятный интервал включает 0, то обнуленный соответствующее следующее среднее значение.
Предскажите в горизонт прогноза.
Оцените FMSE.
numlambda = numel(lambda); % Preallocate BayesLassoCoefficients = zeros(p+1,numlambda); BayesLassoCI95 = zeros(p+1,2,numlambda); fmseBayesLasso = zeros(numlambda,1); BLCPlot = zeros(p+1,numlambda); % Estimate and forecast rng(10); % For reproducibility for j = 1:numlambda PriorMdl.Lambda = lambda(j); [EstMdl,Summary] = estimate(PriorMdl,X,y,'Display',false); BayesLassoCoefficients(:,j) = Summary.Mean(1:(end - 1)); BLCPlot(:,j) = Summary.Mean(1:(end - 1)); BayesLassoCI95(:,:,j) = Summary.CI95(1:(end - 1),:); idx = BayesLassoCI95(:,2,j) > 0 & BayesLassoCI95(:,1,j) <= 0; BLCPlot(idx,j) = 0; yFBayesLasso = forecast(EstMdl,XF); fmseBayesLasso(j) = sqrt(mean((yF - yFBayesLasso).^2)); end
В каждой итерации estimate запускает сэмплер Гиббса к выборке от полных условных выражений (см. Аналитически Послушное Последующее поколение), и возвращает модель empiricalblm EstMdl, который содержит ничьи и сводную таблицу оценки Summary. Можно задать параметры для сэмплера Гиббса, такие как количество ничьих или утончающейся схемы.
Хорошая практика должна диагностировать следующую выборку путем осмотра графиков трассировки. Однако, потому что 100 дистрибутивов чертились, этот пример доходы, не выполняя тот шаг.
Постройте следующие средние значения коэффициентов относительно нормированных штрафов L1 (сумма значений коэффициентов кроме прерывания). На том же графике, но в правильной оси y, строят FMSEs.
L1Vals = sum(abs(BLCPlot(2:end,:)),1)/max(sum(abs(BLCPlot(2:end,:)),1)); figure; plot(L1Vals,BLCPlot(2:end,:)) xlabel('L1'); ylabel('Coefficient Estimates'); yyaxis right h = plot(L1Vals,fmseBayesLasso,'LineWidth',2,'LineStyle','--'); legend(h,'FMSE','Location','SW'); ylabel('FMSE'); title('Bayesian Lasso')

Модель имеет тенденцию делать вывод лучше как нормированные увеличения штрафа L1 прошлые 0.1. Чтобы сбалансировать минимальный FMSE и сложность модели, выберите самую простую модель с FMSE, самым близким к 0,68.
idx = find(fmseBayesLasso > 0.68,1); fmsebestbayeslasso = fmseBayesLasso(idx); bestBayesLasso = BayesLassoCoefficients(:,idx); bestCI95 = BayesLassoCI95(:,:,idx); table(bestBayesLasso,bestCI95,'RowNames',["Intercept" predictornames])
ans =
14x2 table
bestBayesLasso bestCI95
______________ ______________________
Intercept 90.587 79.819 101.62
log_COE 6.5591 1.8093 11.239
log_CPIAUCSL -2.2971 -6.9019 1.7057
log_GCE -5.1707 -7.4902 -2.8583
log_GDP 9.8839 2.3848 17.672
log_GDPDEF 10.281 5.1677 15.936
log_GPDI -2.0973 -3.2168 -0.96728
log_GS10 0.82485 0.22748 1.4237
log_HOANBS -32.538 -35.589 -29.526
log_M1SL -3.0656 -4.1499 -2.0066
log_M2SL -1.1007 -3.1243 0.75844
log_PCEC -3.3342 -9.6496 1.8482
FEDFUNDS 0.043672 -0.056192 0.14254
TB3MS -0.15682 -0.29385 -0.022145
Один способ определить, незначительна ли переменная или избыточная, путем проверки, является ли 0 в его соответствующем коэффициенте 95%-м вероятным интервалом. Используя этот критерий, CPIAUCSL, M2SL, PCEC и FEDFUNDS незначительны.
Отобразите все оценки в таблице для сравнения.
SLRR = zeros(p + 1,1); SLRR([true idxreduced]) = SLRMdlReduced.Coefficients.Estimate; table([SLRMdlFull.Coefficients.Estimate; fmseSLRR],... [SLRR; fmseSLRR],... [bestLasso; fmsebestlasso],... [bestBayesLasso; fmsebestbayeslasso],'VariableNames',... {'SLRFull' 'SLRReduced' 'Lasso' 'BayesLasso'},... 'RowNames',[PriorMdl.VarNames; 'MSE'])
ans =
15x4 table
SLRFull SLRReduced Lasso BayesLasso
________ __________ ________ __________
Intercept 88.014 88.327 61.154 90.587
log_COE 7.1111 10.854 0.042061 6.5591
log_CPIAUCSL -3.4032 0 0 -2.2971
log_GCE -5.63 -6.1958 0 -5.1707
log_GDP 14.522 16.701 0 9.8839
log_GDPDEF 11.926 9.1106 8.524 10.281
log_GPDI -2.5939 -2.6963 0 -2.0973
log_GS10 0.57467 0 1.6957 0.82485
log_HOANBS -32.861 -33.782 -18.937 -32.538
log_M1SL -3.3023 -2.8099 -1.3365 -3.0656
log_M2SL -1.3845 0 0.17948 -1.1007
log_PCEC -7.143 -14.207 0 -3.3342
FEDFUNDS 0.044542 0 0 0.043672
TB3MS -0.1577 -0.078449 -0.14459 -0.15682
MSE 0.61048 0.61048 0.79425 0.69639
После того, как вы выбрали модель, повторно оцените его с помощью целого набора данных. Например, чтобы создать прогнозирующую Байесовую модель регрессии лассо, создайте предшествующую модель и задайте уменьшение, приводящее к самой простой модели с минимальным FMSE, затем оцените его с помощью целого набора данных.
bestLambda = lambda(idx); PriorMdl = bayeslm(p,'ModelType','lasso','Lambda',bestLambda,... 'VarNames',predictornames); PosteriorMdl = estimate(PriorMdl,[X; XF],[y; yF]);
Method: lasso MCMC sampling with 10000 draws
Number of observations: 201
Number of predictors: 14
| Mean Std CI95 Positive Distribution
-----------------------------------------------------------------------------
Intercept | 85.9643 5.2710 [75.544, 96.407] 1.000 Empirical
log_COE | 12.3574 2.1817 [ 8.001, 16.651] 1.000 Empirical
log_CPIAUCSL | 0.1498 1.9150 [-3.733, 4.005] 0.525 Empirical
log_GCE | -7.1850 1.0556 [-9.208, -5.101] 0.000 Empirical
log_GDP | 11.8648 3.9955 [ 4.111, 19.640] 0.999 Empirical
log_GDPDEF | 8.8777 2.4221 [ 4.033, 13.745] 1.000 Empirical
log_GPDI | -2.5884 0.5294 [-3.628, -1.553] 0.000 Empirical
log_GS10 | 0.6910 0.2577 [ 0.194, 1.197] 0.997 Empirical
log_HOANBS | -32.3356 1.4941 [-35.276, -29.433] 0.000 Empirical
log_M1SL | -2.2279 0.5043 [-3.202, -1.238] 0.000 Empirical
log_M2SL | 0.3617 0.9123 [-1.438, 2.179] 0.652 Empirical
log_PCEC | -11.3018 3.0353 [-17.318, -5.252] 0.000 Empirical
FEDFUNDS | -0.0132 0.0490 [-0.109, 0.082] 0.392 Empirical
TB3MS | -0.1128 0.0660 [-0.244, 0.016] 0.042 Empirical
Sigma2 | 0.1186 0.0122 [ 0.097, 0.145] 1.000 Empirical
estimate | forecast | simulate