Этот пример показывает, как выполнить выбор переменной при помощи регрессии Байесова лассо.
Регрессия Лассо является линейным методом регрессии, который комбинирует регуляризацию и выбор переменных. Регуляризация помогает предотвратить сверхподбор кривой, уменьшая величину коэффициентов регрессии. Частотное представление регрессии лассо отличается от других методов регуляризации, таких как регрессия гребня, потому что лассо приписывает значение в точности 0 коэффициентам регрессии, соответствующим предикторам, которые незначительны или избыточны.
Рассмотрим эту множественную линейную регрессионую модель:
является вектором n откликов.
является матрицей из p соответствующих наблюдаемых переменных предиктора.
является вектором p коэффициентов регрессии.
является точка пересечения.
- длина n вектора-столбца таковых.
является случайным вектором iid Гауссовых нарушений порядка со средним значением 0 и отклонением.
Целевой функцией частотного взгляда на регрессию лассо является
- срок штрафа (или усадки) и, в отличие от других параметров, не соответствует данным. Вы должны задать значение для перед оценкой, и лучшая практика - настроить его. После того, как вы задаете значение, минимизируется относительно коэффициентов регрессии. Получившиеся коэффициенты являются оценками lasso. Для получения дополнительной информации о частом взгляде на регрессию лассо смотрите [186].
В данном примере рассмотрите создание прогнозирующей линейной модели для уровня безработицы в США. Вы хотите модель, которая хорошо обобщается. Другими словами, вы хотите минимизировать сложность модели путем удаления всех избыточных предикторов и всех предикторов, которые некоррелированы с уровнем безработицы.
Загрузите набор макроэкономических данных США Data_USEconModel.mat
.
load Data_USEconModel
Набор данных включает расписание MATLAB ® DataTable
, которая содержит 14 переменных, измеренных с Q1 1947 по Q1 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 = gca; h.XTickLabelRotation = 45; 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
являются незначительными переменными.
Обновите линейную модель без незначительных переменных в данных предиктора. Используя полную и уменьшенную модели, прогнозируйте уровень безработицы в прогнозный горизонт, затем оценивайте FMSE.
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));
Постройте график величины коэффициентов регрессии относительно значения усадки.
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
являются незначительными или избыточными.
В байесовском представлении регрессии лассо предшествующее распределение коэффициентов регрессии является Лапласом (двойной экспоненциальной) со средним 0 и шкалой, где является параметром фиксированной усадки и. Для получения дополнительной информации смотрите lassoblm
.
Как и при частом виде регрессии лассо, если вы увеличиваете, то разреженность полученной модели увеличивается монотонно. Однако, в отличие от частотного лассо, байесовское лассо имеет незначительные или избыточные режимы коэффициентов, которые не совсем 0. Вместо этого оценки имеют апостериорное распределение и являются незначительными или избыточными, если область около 0 имеет высокую плотность.
Когда вы реализуете регрессию Bayesian lasso в MATLAB ®, будьте в курсе нескольких различий между функцией Statistics and Machine Learning Toolbox™ lasso
и объект Econometrics Toolbox™ lassoblm
и связанных с ним функций.
lassoblm
является частью среды объекта, в то время как lasso
является функцией. Среда объекта оптимизирует эконометрические рабочие процессы.
В отличие от lasso
, lassoblm
не стандартизирует данные предиктора. Однако для каждого коэффициента можно задать различные значения усадки. Эта функция помогает поддерживать интерпретируемость оценок коэффициентов.
lassoblm
применяет одно значение усадки к каждому коэффициенту; он не принимает путь регуляризации, подобный lasso
.
Потому что lassoblm
среда подходит для выполнения регрессии Bayesian lasso для одного значения усадки на коэффициент, можно использовать цикл for для выполнения lasso по пути регуляризации.
Создайте байесову регрессию лассо предыдущую модель при помощи 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% достоверные интервалы.
Для lasso plot, если 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