В этом примере показано, как обучить кредитный риск вероятности значения по умолчанию (PD) предсказание с помощью глубокой нейронной сети. Пример также показывает, как использовать локально поддающиеся толкованию объяснения модели агностические (LIME) и значения Шепли interpretability методы, чтобы изучить предсказания модели. Кроме того, пример анализирует предсказания модели для значений из выборки и выполняет анализ стресс-тестирования.
Стресс-тестирование Вероятностей Значения по умолчанию Потребительского кредита Используя пример Данных о Панели представляет подобный рабочий процесс, но использует логистическую модель. Вероятности Моделирования Значения по умолчанию с Cox Пропорциональный пример Опасностей используют регрессию Cox или Cox пропорциональная модель опасностей. Однако методы interpretability не обсуждены ни в одном из этих примеров, потому что модели являются более простыми и поддающимися толкованию. Сравнить Нейронные сети для глубокого обучения для Предсказания Значения по умолчанию Кредита (Deep Learning Toolbox) пример фокусируется на альтернативных проектированиях сети и подбирает более простые модели без макроэкономических переменных.
В то время как можно использовать эти альтернативные, более простые модели успешно, чтобы смоделировать кредитный риск, этот пример вводит explainability инструменты для исследования комплексных техник моделирования в заявках на кредит. Чтобы визуализировать и интерпретировать предсказания модели, вы используете Deep Learning Toolbox™ и lime
и shapley
функции. Запускать этот пример, вас:
Загрузите и подготовьте данные о кредите, переформатируйте предикторы и разделите данные в обучение, валидацию и тестирующие наборы.
Задайте сетевую архитектуру, выберите опции обучения и обучите сеть. (Сохраненная версия обучившего сеть residualTrainedNetworkMacro
доступно для удобства.)
Примените LIME и Шепли interpretability методы на наблюдениях за интересом (или "точки запроса"), чтобы определить, как ожидалось ли важность предикторов в модели.
Исследуйте экстремальный предиктор значения из выборки, чтобы исследовать поведение модели для новых, экстремальных данных.
Используйте модель, чтобы выполнить анализ стресс-тестирования предсказанных значений PD.
Загрузите розничный набор данных панели кредита включая его макроэкономические переменные. Основной набор данных (data
) содержит следующие переменные:
ID
: Идентификатор ссуды
ScoreGroup
: Кредитный рейтинг в начале ссуды, дискретизированной в три группы, High Risk
, Medium Risk
, и Low Risk
YOB
: Годы на книгах
Default
: Индикатор по умолчанию; переменная отклика
Year
: Календарный год
Небольшой набор данных (dataMacro
) содержит макроэкономические данные в течение соответствующих календарных лет:
Year
: Календарный год
GDP
: Рост валового внутреннего продукта (год за год)
Market
: Рынок возвращается (год за год)
Переменные YOB
год
, GDP
, и Market
наблюдаются в конце соответствующего календарного года. Группа счета является дискретизацией исходного кредитного рейтинга когда запущенная ссуда. Значение 1
для Default
средние значения, что ссуда приняла значение по умолчанию в соответствующий календарный год.
Третий набор данных (dataMacroStress
) содержит базовую линию, неблагоприятные, и сильно неблагоприятные сценарии для макроэкономических переменных. Эта таблица для анализа стресс-тестирования.
Этот пример использует симулированные данные, но тот же подход был успешно применен к действительным наборам данных.
load RetailCreditPanelData.mat
data = join(data,dataMacro);
head(data)
ans=8×7 table
ID ScoreGroup YOB Default Year GDP Market
__ __________ ___ _______ ____ _____ ______
1 Low Risk 1 0 1997 2.72 7.61
1 Low Risk 2 0 1998 3.57 26.24
1 Low Risk 3 0 1999 2.86 18.1
1 Low Risk 4 0 2000 2.43 3.19
1 Low Risk 5 0 2001 1.26 -10.51
1 Low Risk 6 0 2002 -0.59 -22.95
1 Low Risk 7 0 2003 0.63 2.78
1 Low Risk 8 0 2004 1.85 9.48
Чтобы обучить нейронную сеть для глубокого обучения, необходимо сначала закодировать категориальный ScoreGroup
переменная к одногорячим закодированным векторам.
Просмотрите порядок ScoreGroup
категории.
categories(data.ScoreGroup)'
ans = 1×3 cell
{'High Risk'} {'Medium Risk'} {'Low Risk'}
ans =
1×3 cell
{'High Risk'} {'Medium Risk'} {'Low Risk'}
Одногорячий кодируют ScoreGroup
переменная.
riskGroup = onehotencode(data.ScoreGroup,2);
Добавьте одногорячие векторы в таблицу.
data.HighRisk = riskGroup(:,1); data.MediumRisk = riskGroup(:,2); data.LowRisk = riskGroup(:,3);
Удалите исходный ScoreGroup
переменная из таблицы с помощью removevars
.
data = removevars(data,{'ScoreGroup'});
Переместите Default
переменная в конец таблицы, когда эта переменная является ответом, который вы хотите предсказать.
data = movevars(data,'Default','After','LowRisk');
Просмотрите первые несколько строк таблицы. ScoreGroup
переменная разделена в несколько столбцов с категориальными значениями как имена переменных.
head(data)
ans=8×9 table
ID YOB Year GDP Market HighRisk MediumRisk LowRisk Default
__ ___ ____ _____ ______ ________ __________ _______ _______
1 1 1997 2.72 7.61 0 0 1 0
1 2 1998 3.57 26.24 0 0 1 0
1 3 1999 2.86 18.1 0 0 1 0
1 4 2000 2.43 3.19 0 0 1 0
1 5 2001 1.26 -10.51 0 0 1 0
1 6 2002 -0.59 -22.95 0 0 1 0
1 7 2003 0.63 2.78 0 0 1 0
1 8 2004 1.85 9.48 0 0 1 0
Разделите набор данных в обучение, валидацию, и протестируйте разделы с помощью уникальных идентификационных номеров ссуды. Отложите 60% данных для обучения, 20% для валидации и 20% для тестирования.
Найдите уникальные идентификаторы ссуды.
idx = unique(data.ID); numObservations = length(idx);
Определите количество наблюдений для каждого раздела.
numObservationsTrain = floor(0.6*numObservations); numObservationsValidation = floor(0.2*numObservations); numObservationsTest = numObservations - numObservationsTrain - numObservationsValidation;
Создайте массив случайных индексов, соответствующих наблюдениям, и разделите его с помощью размеров раздела.
rng('default'); % for reproducibility idxShuffle = idx(randperm(numObservations)); idxTrain = idxShuffle(1:numObservationsTrain); idxValidation = idxShuffle(numObservationsTrain+1:numObservationsTrain+numObservationsValidation); idxTest = idxShuffle(numObservationsTrain+numObservationsValidation+1:end);
Найдите записи таблицы, соответствующие разделам набора данных.
idxTrainTbl = ismember(data.ID,idxTrain); idxValidationTbl = ismember(data.ID,idxValidation); idxTestTbl = ismember(data.ID,idxTest);
Сохраните представляющие интерес переменные для задачи (YOB
, Default
, и ScoreGroup
) и удалите все другие переменные из таблицы.
data = removevars(data,{'ID','Year'}); head(data)
ans=8×7 table
YOB GDP Market HighRisk MediumRisk LowRisk Default
___ _____ ______ ________ __________ _______ _______
1 2.72 7.61 0 0 1 0
2 3.57 26.24 0 0 1 0
3 2.86 18.1 0 0 1 0
4 2.43 3.19 0 0 1 0
5 1.26 -10.51 0 0 1 0
6 -0.59 -22.95 0 0 1 0
7 0.63 2.78 0 0 1 0
8 1.85 9.48 0 0 1 0
Разделите таблицу данных в обучение, валидацию и разделы тестирования с помощью индексов.
tblTrain = data(idxTrainTbl,:); tblValidation = data(idxValidationTbl,:); tblTest = data(idxTestTbl,:);
Можно использовать различные архитектуры глубокого обучения для задачи предсказания вероятностей значения по умолчанию кредита. Меньшие сети быстры, чтобы обучаться, но более глубокие сети могут узнать больше абстрактные функции. Выбор архитектуры нейронной сети требует балансирующегося времени вычисления против точности. Этот пример использует остаточную архитектуру. Для примера других сетей смотрите Сравнить Нейронные сети для глубокого обучения для Предсказания Значения по умолчанию Кредита (Deep Learning Toolbox) пример.
Создайте остаточную архитектуру (ResNet) из нескольких стеков активаций ReLU и полносвязных слоев. Архитектуры ResNet являются состоянием в применении глубокого обучения и популярный в литературе глубокого обучения. Первоначально разработанный для классификации изображений, ResNets оказались успешными через многие области [1].
residualLayers = [ featureInputLayer(6, 'Normalization', 'zscore', 'Name', 'input') fullyConnectedLayer(16, 'Name', 'fc1','WeightsInitializer','he') batchNormalizationLayer('Name', 'bn1') reluLayer('Name','relu1') fullyConnectedLayer(32, 'Name', 'resblock1-fc1','WeightsInitializer','he') batchNormalizationLayer('Name', 'resblock1-bn1') reluLayer('Name', 'resblock1-relu1') fullyConnectedLayer(32, 'Name', 'resblock1-fc2','WeightsInitializer','he') additionLayer(2, 'Name', 'resblock1-add') batchNormalizationLayer('Name', 'resblock1-bn2') reluLayer('Name', 'resblock1-relu2') fullyConnectedLayer(64, 'Name', 'resblock2-fc1','WeightsInitializer','he') batchNormalizationLayer('Name', 'resblock2-bn1') reluLayer('Name', 'resblock2-relu1') fullyConnectedLayer(64, 'Name', 'resblock2-fc2','WeightsInitializer','he') additionLayer(2, 'Name', 'resblock2-add') batchNormalizationLayer('Name', 'resblock2-bn2') reluLayer('Name', 'resblock2-relu2') fullyConnectedLayer(1, 'Name', 'fc2','WeightsInitializer','he') sigmoidLayer('Name', 'sigmoid') BinaryCrossEntropyLossLayer('output')]; residualLayers = layerGraph(residualLayers); residualLayers = addLayers(residualLayers,fullyConnectedLayer(32, 'Name', 'resblock1-fc-shortcut')); residualLayers = addLayers(residualLayers,fullyConnectedLayer(64, 'Name', 'resblock2-fc-shortcut')); residualLayers = connectLayers(residualLayers, 'relu1', 'resblock1-fc-shortcut'); residualLayers = connectLayers(residualLayers, 'resblock1-fc-shortcut', 'resblock1-add/in2'); residualLayers = connectLayers(residualLayers, 'resblock1-relu2', 'resblock2-fc-shortcut'); residualLayers = connectLayers(residualLayers, 'resblock2-fc-shortcut', 'resblock2-add/in2');
Можно визуализировать сеть с помощью Deep Network Designer (Deep Learning Toolbox) или analyzeNetwork
(Deep Learning Toolbox) функция.
deepNetworkDesigner(residualLayers)
В этом примере обучите каждую сеть с этими опциями обучения:
Обучите использование оптимизатора Адама.
Установите начальную скорость обучения на 0.001
.
Установите мини-пакетный размер на 512
.
Обучайтесь для 75
эпохи.
Включите график процесса обучения и выключите командное окно выход.
Переставьте данные в начале каждой эпохи.
Контролируйте сетевую точность во время обучения путем определения данных о валидации и использования его, чтобы проверить сеть каждые 1 000 итераций.
options = trainingOptions('adam', ... 'InitialLearnRate',0.001, ... 'MiniBatchSize',512, ... 'MaxEpochs',75, ... 'Plots','training-progress', ... 'Verbose',false, ... 'Shuffle','every-epoch', ... 'ValidationData',tblValidation, ... 'ValidationFrequency',1000);
Сравнить Нейронные сети для глубокого обучения для Предсказания Значения по умолчанию Кредита (Deep Learning Toolbox), пример соответствует тому же типу сети, но это исключает макроэкономические предикторы. В том примере, если вы увеличиваете число эпох от 50
к 75
, можно улучшить точность, не сверхсоответствуя проблемам.
Можно выполнить оптимизацию программно или в интерактивном режиме использование Experiment Manager (Deep Learning Toolbox). Для примера, показывающего, как выполнить развертку гиперпараметра опций обучения, смотрите, Создают Эксперимент Глубокого обучения для Классификации (Deep Learning Toolbox).
Обучите сеть с помощью архитектуры, которая по сравнению с предыдущим годом задала, обучающие данные и опции обучения. По умолчанию, analyzeNetwork
(Deep Learning Toolbox) использует графический процессор, если вы доступны; в противном случае это использует центральный процессор. Обучение на графическом процессоре требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент значения имени trainingOptions
(Deep Learning Toolbox).
Чтобы постараться не ожидать обучения, загрузите предварительно обученные сети путем установки doTrain
отметьте к false
. Обучать сети с помощью analyzeNetwork
(Deep Learning Toolbox), набор doTrain
отметьте к true
. Окно Training Progress отображает прогресс. Учебное время с помощью NVIDIA® GeForce® RTX 2080 составляет приблизительно 35 минут в течение 75 эпох.
doTrain = false; if doTrain residualNetMacro = trainNetwork(tblTrain,'Default',residualLayers,options); else load residualTrainedNetworkMacro.mat end
Используйте predict
(Deep Learning Toolbox) функция, чтобы предсказать вероятность по умолчанию тестовых данных с помощью обучившего нейронные сети.
tblTest.residualPred = predict(residualNetMacro,tblTest(:,1:end-1));
Постройте уровни по умолчанию к году на книгах
Чтобы оценить эффективность сети, используйте groupsummary
функционируйте, чтобы сгруппировать истинные уровни по умолчанию и соответствующие предсказания к годам на книгах (представленный YOB
переменная), и вычисляют среднее значение.
summaryYOB = groupsummary(tblTest,'YOB','mean',{'Default','residualPred'}); head(summaryYOB)
ans=8×4 table
YOB GroupCount mean_Default mean_residualPred
___ __________ ____________ _________________
1 19364 0.017352 0.017688
2 18917 0.012158 0.013354
3 18526 0.011875 0.011522
4 18232 0.011683 0.010485
5 17925 0.0082008 0.0090247
6 17727 0.0066565 0.0066525
7 12294 0.0030909 0.0034051
8 6361 0.0017293 0.0018151
Постройте истинный средний уровень по умолчанию против средних предсказаний YOB
.
figure scatter(summaryYOB.YOB,summaryYOB.mean_Default*100,'*'); hold on plot(summaryYOB.YOB,summaryYOB.mean_residualPred*100); hold off title('Residual Network') xlabel('Years on Books') ylabel('Default Rate (%)') legend('Observed','Predicted')
График показывает хорошую подгонку на тестовых данных. Модель, кажется, получает общую тенденцию как возраст ссуды (YOB
значение) увеличения, а также изменения в крутизне тренда.
Остальная часть этого примера показывает некоторые способы лучше изучить модель. Во-первых, это рассматривает стандарт explainability методы, что можно обратиться к этой модели, а именно, lime
и shapley
функции. Затем это исследует поведение модели в новых значениях данных (из выборки). Наконец, пример использует модель, чтобы предсказать значения PD при подчеркнутых макроэкономических условиях, также известных как стресс-тестирование.
Метод локальных поддающихся толкованию объяснений модели агностических (LIME) и метод Шепли обе цели объяснить поведение модели при конкретном наблюдении за интересом или "точкой запроса". А именно, эти методы помогают вам изучить важность каждой переменной в предсказании, сделанном для конкретного наблюдения. Для получения дополнительной информации смотрите lime
и shapley
.
В целях рисунка выберите два наблюдения из данных, чтобы лучше интерпретировать предсказания модели. Значения отклика (последний столбец) не нужны.
Первое наблюдение является закаленной ссудой с низким риском. Другими словами, это имеет начальный счет LowRisk
и восемь лет на книгах.
obs1 = data(8,1:end-1); disp(obs1)
YOB GDP Market HighRisk MediumRisk LowRisk ___ ____ ______ ________ __________ _______ 8 1.85 9.48 0 0 1
Второе наблюдение является новой, рискованной ссудой. Таким образом, счетом является HighRisk
и это находится на своем первом году на книгах.
obs2 = data(88,1:end-1); disp(obs2)
YOB GDP Market HighRisk MediumRisk LowRisk ___ ____ ______ ________ __________ _______ 1 2.72 7.61 1 0 0
Оба lime
и shapley
потребуйте набора справочных данных со значениями предиктора. Эти справочные данные могут быть обучающими данными сами или любыми другими справочными данными, где модель может быть оценена, чтобы исследовать поведение модели. Больше точек данных позволяет explainability методам изучать поведение модели в большем количестве областей. Однако большой набор данных может также замедлить расчеты, особенно для shapley
. В целях рисунка используйте первые 1 000 строк от обучающего набора данных. Значения отклика (последний столбец) не нужны.
predictorData = data(1:1000,1:end-1);
lime
и shapley
также потребуйте указателя на функцию к predict
(Deep Learning Toolbox) функция. Обработайте predict
(Deep Learning Toolbox) как модель черного ящика и вызов это многократно, чтобы сделать предсказания на данных и собрать информацию о поведении модели.
blackboxFcn = @(x)predict(residualNetMacro,x);
lime
ОбъектСоздайте lime
объект путем передачи указателя на функцию черного ящика и выбранных данных о предикторе.
Случайным образом сгенерированные синтетические данные, лежащие в основе lime
может влиять на важность. Отчет может измениться в зависимости от синтетических сгенерированных данных. Это может также измениться из-за дополнительных аргументов, таких как 'KernelWidth'
параметр, который управляет областью вокруг наблюдения за интересом ("точка запроса"), в то время как вы подбираете локальную модель.
explainerLIME = lime(blackboxFcn,predictorData,'Type','regression');
Выберите много важных предикторов интереса и подбирайте локальную модель вокруг выбранных наблюдений. В целях рисунка модель содержит все предикторы.
numImportantPredictors = 6; explainerObs1 = fit(explainerLIME,obs1,numImportantPredictors); explainerObs2 = fit(explainerLIME,obs2,numImportantPredictors);
Постройте важность для каждого предиктора.
figure subplot(2,1,1) plot(explainerObs1); subplot(2,1,2) plot(explainerObs2);
lime
результаты весьма схожи для обоих наблюдений. Информация в графиках показывает, что наиболее важными переменными является High
Risk
и Medium
Risk
переменные. High
Risk
и Medium
Risk
способствуйте положительно более высоким вероятностям значения по умолчанию. С другой стороны, YOB,
LowRisk
, GDP
, и Market
имейте отрицательный вклад в вероятность по умолчанию. Market
переменная, кажется, не способствует так же как другие переменные. Значения в графиках являются коэффициентами простой модели, подбиравшей вокруг интересного места, таким образом, значения могут быть интерпретированы как чувствительность PD к различным предикторам, и эти результаты, кажется, выравниваются с ожиданиями. Например, предсказания PD уменьшаются как YOB
значение (возраст ссуды) увеличения, сопоставимые с тенденцией к понижению, наблюдаемой в модели приспособленный график в разделе Test Network.
shapley
ОбъектШаги для создания shapley
объект эквивалентен для lime
. Создайте shapley
объект путем передачи указателя на функцию черного ящика и данных о предикторе, выбранных ранее.
shapley
анализ может также быть затронут случайным образом сгенерированными данными, и это требует, чтобы различные методы управляли симуляциями, требуемыми для анализа. В целях рисунка создайте shapley
объект с настройками по умолчанию.
explainerShapley = shapley(blackboxFcn,predictorData);
Найдите и постройте важность предикторов для каждой точки запроса. shapley
более в вычислительном отношении интенсивно, чем lime
. Как количество строк в увеличениях данных о предикторе, вычислительное время для shapley
увеличения результатов. Для больших наборов данных, с помощью параллельных вычислений рекомендуется (см. 'UseParallel'
опция в shapley
).
explainerShapleyObs1 = fit(explainerShapley, obs1); explainerShapleyObs2 = fit(explainerShapley, obs2); figure; subplot(2,1,1) plot(explainerShapleyObs1) subplot(2,1,2) plot(explainerShapleyObs2)
В этом случае результаты выглядят по-другому для этих двух наблюдений. shapley
результаты объясняют отклонения от среднего предсказания PD. Для первого наблюдения, которое является наблюдением очень с низким риском, ожидаемым значением является значительно ниже среднего PD Поэтому весь shapley
значения отрицательны с YOB
будучи наиболее важной переменной в этом случае, сопровождаемый LowRisk
. Для второго наблюдения, которое является наблюдением очень высокого риска, большей частью shapley
значения положительны с YOB
и HighRisk
как основные факторы предсказанного PD много больше среднего значения.
Разделение исходного набора данных в обучение, валидацию и тестирование помогает предотвратить сверхподбор кривой. Однако валидация и наборы тестовых данных совместно используют подобные характеристики с обучающими данными, например, областью значений значений для YOB
, или наблюдаемые величины для макроэкономических переменных.
rangeYOB = [min(data.YOB) max(data.YOB)]
rangeYOB = 1×2
1 8
rangeGDP = [min(data.GDP) max(data.GDP)]
rangeGDP = 1×2
-0.5900 3.5700
rangeMarket = [min(data.Market) max(data.Market)]
rangeMarket = 1×2
-22.9500 26.2400
Можно исследовать поведение модели из выборки (OOS) двумя различными способами. Во-первых, можно предсказать для значений возраста (YOB
переменная), больше, чем максимальное значение возраста наблюдается в данных. Можно предсказать YOB
значения до 15
. Во-вторых, можно предсказать для экономических условий, не наблюдаемых в данных также. Этот пример использует две чрезвычайно серьезных макроэкономических ситуации, где оба GDP
и Market
значения очень отрицательны и вне области значений значений в данных.
Запустите путем подготовки базового сценария, где последние макроэкономические данные в выборке используются в качестве ссылки. YOB
значения выходят из выборки для всех сценариев.
dataBaseline = table; dataBaseline.YOB = repmat((1:15)',3,1); dataBaseline.GDP = zeros(size(dataBaseline.YOB)); dataBaseline.Market = zeros(size(dataBaseline.YOB)); dataBaseline.HighRisk = zeros(size(dataBaseline.YOB)); dataBaseline.MediumRisk = zeros(size(dataBaseline.YOB)); dataBaseline.LowRisk = zeros(size(dataBaseline.YOB)); dataBaseline.GDP(:) = data.GDP(8); dataBaseline.Market(:) = data.Market(8); dataBaseline.HighRisk(1:15) = 1; dataBaseline.MediumRisk(16:30) = 1; dataBaseline.LowRisk(31:45) = 1; disp(head(dataBaseline))
YOB GDP Market HighRisk MediumRisk LowRisk ___ ____ ______ ________ __________ _______ 1 1.85 9.48 1 0 0 2 1.85 9.48 1 0 0 3 1.85 9.48 1 0 0 4 1.85 9.48 1 0 0 5 1.85 9.48 1 0 0 6 1.85 9.48 1 0 0 7 1.85 9.48 1 0 0 8 1.85 9.48 1 0 0
Создайте два новых экстремальных сценария, которые включают значения из выборки не только для YOB
, но также и для макроэкономических переменных. Этот пример использует пессимистические сценарии, но вы могли повторить анализ для оптимистических ситуаций, чтобы исследовать поведение модели в любом виде экстремальной ситуации.
dataExtremeS1 = dataBaseline; dataExtremeS1.GDP(:) = -1; dataExtremeS1.Market(:) = -25; dataExtremeS2 = dataBaseline; dataExtremeS2.GDP(:) = -2; dataExtremeS2.Market(:) = -40;
Предскажите значения PD для всех сценариев с помощью predict
(Deep Learning Toolbox).
dataBaseline.PD = predict(residualNetMacro,dataBaseline); dataExtremeS1.PD = predict(residualNetMacro,dataExtremeS1); dataExtremeS2.PD = predict(residualNetMacro,dataExtremeS2);
Визуализируйте результаты для выбранного счета. Для удобства среднее значение значений PD по этим трем баллам визуализируется как сводные данные.
ScoreSelected = "High"; switch ScoreSelected case 'High' ScoreInd = dataBaseline.HighRisk == 1; PredPDYOB = [dataBaseline.PD (ScoreInd) dataExtremeS1. PD (ScoreInd) dataExtremeS2. PD (ScoreInd)]; case 'Medium' ScoreInd = dataBaseline.MediumRisk == 1; PredPDYOB = [dataBaseline.PD (ScoreInd) dataExtremeS1. PD (ScoreInd) dataExtremeS2. PD (ScoreInd)]; case 'Low' ScoreInd = dataBaseline.LowRisk == 1; PredPDYOB = [dataBaseline.PD (ScoreInd) dataExtremeS1. PD (ScoreInd) dataExtremeS2. PD (ScoreInd)]; case 'Average' PredPDYOBBase = groupsummary (dataBaseline,'YOB','mean','PD'); PredPDYOBS1 = groupsummary (dataExtremeS1,'YOB','mean','PD'); PredPDYOBS2 = groupsummary (dataExtremeS2,'YOB','mean','PD'); PredPDYOB = [PredPDYOBBase.mean_PD PredPDYOBS1.mean_PD PredPDYOBS2.mean_PD]; end фигура; панель (PredPDYOB*100); xlabel'Years on Books') yLabel 'Probability of Default (%)') легенда'Baseline','Scenario 1','Scenario 2') заголовок (strcat ("Out-of-Sample Scenarios, ", ScoreSelected," Score")) сетка on
Полные результаты соответствуют ожиданиям, начиная с уменьшения значений PD как YOB
повышения стоимости и худшие экономические условия приводят к более высоким значениям PD. Однако относительное увеличение предсказанных значений PD показывает интересный результат. Для Low
и Medium
баллы, существует значительное увеличение в течение первого года на книгах (YOB
= 1 ). В отличие от этого для
High
баллы, относительное увеличение с базовой линии, к первому экстремальному сценарию, затем к второму крайнему случаю, малы. Этот результат предлагает неявный верхний предел в ожидаемых значениях в структуре модели. Экстремальные сценарии в этом осуществлении кажутся маловероятными произойти, однако, для экстремальных но вероятных сценариев, это поведение потребовало бы расследования со стресс-тестированием.
Поскольку модель включает макроэкономические переменные, она может использоваться, чтобы выполнить анализ стресс-тестирования (см., например [2], [3], [4]). Шаги похожи на предыдущий раздел за исключением того, что сценарии периодически являются вероятным набором сценариев на уровне учреждения, или собиравшийся регуляторами использоваться всеми учреждениями.
dataMacroStress
набор данных содержит три сценария для стресс-тестирования модели, а именно, базовой линии, неблагоприятных, и сильно неблагоприятных сценариев. Неблагоприятные и серьезные сценарии относительно базового сценария, и макроэкономические условия, вероятны, учитывая базовую линию. Эти сценарии находятся в пределах области значений значений, наблюдаемых в данных, используемых для обучения и валидации. Стресс-тестирование значений PD для данных макроэкономических сценариев концептуально отличается от упражнения в предыдущем разделе, где особое внимание находится на исследовании поведения модели на данных из выборки, независимо от того, насколько вероятный те экстремальные сценарии с экономической точки зрения.
Выполняя предшествующие шаги, вы генерируете предсказания PD для каждого уровня счета и каждого сценария.
dataBaselineStress = dataBaseline(:,1:end-1); dataAdverse = dataBaselineStress; dataSevere = dataBaselineStress; dataBaselineStress.GDP(:) = dataMacroStress{'Baseline','GDP'}; dataBaselineStress.Market(:) = dataMacroStress{'Baseline','Market'}; dataAdverse.GDP(:) = dataMacroStress{'Adverse','GDP'}; dataAdverse.Market(:) = dataMacroStress{'Adverse','Market'}; dataSevere.GDP(:) = dataMacroStress{'Severe','GDP'}; dataSevere.Market(:) = dataMacroStress{'Severe','Market'};
Используйте predict
(Deep Learning Toolbox) функция, чтобы предсказать значения PD для всех сценариев. Визуализируйте результаты для выбранного счета.
dataBaselineStress.PD = predict(residualNetMacro,dataBaselineStress); dataAdverse.PD = predict(residualNetMacro,dataAdverse); dataSevere.PD = predict(residualNetMacro,dataSevere); ScoreSelected = "Average"; switch ScoreSelected case 'High' ScoreInd = dataBaselineStress.HighRisk == 1; PredPDYOBStress = [dataBaselineStress.PD (ScoreInd) dataAdverse.PD (ScoreInd) dataSevere.PD (ScoreInd)]; case 'Medium' ScoreInd = dataBaselineStress.MediumRisk == 1; PredPDYOBStress = [dataBaselineStress.PD (ScoreInd) dataAdverse.PD (ScoreInd) dataSevere.PD (ScoreInd)]; case 'Low' ScoreInd = dataBaselineStress.LowRisk == 1; PredPDYOBStress = [dataBaselineStress.PD (ScoreInd) dataAdverse.PD (ScoreInd) dataSevere.PD (ScoreInd)]; case 'Average' PredPDYOBBaseStress = groupsummary (dataBaselineStress,'YOB','mean','PD'); PredPDYOBAdverse = groupsummary (dataAdverse,'YOB','mean','PD'); PredPDYOBSevere = groupsummary (dataSevere,'YOB','mean','PD'); PredPDYOBStress = [PredPDYOBBaseStress.mean_PD PredPDYOBAdverse.mean_PD PredPDYOBSevere.mean_PD]; end фигура; панель (PredPDYOBStress*100); xlabel'Years on Books') yLabel 'Probability of Default (%)') легенда'Baseline','Adverse','Severe') заголовок (strcat ("PD Stress Testing, ", ScoreSelected," Score")) сетка on
Полные результаты соответствуют ожиданиям. Как в Исследовании раздела Model Predictions Из выборки, предсказаний для High
выиграйте на первом году на книгах (YOB
= 1 ) потребности, которые будут рассмотрены, поскольку относительное увеличение предсказанного PD от одного сценария до следующего кажется меньшим, чем для других баллов и возрастов ссуды. Все другие предсказания показывают разумный шаблон, которые сопоставимы с ожиданиями.
[1] Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Глубокая невязка, учащаяся для распознавания изображений". В Продолжениях Конференции по IEEE по Компьютерному зрению и Распознаванию образов. стр 770–778, 2016.
[2] Федеральная резервная система, Анализ Comprehensive Capital и Анализ (CCAR): https://www.federalreserve.gov/bankinforeg/ccar.htm
[3] Банк Англии, Стресс-тестирование: https://www.bankofengland.co.uk/financial-stability
[4] Европейские Банковские полномочия, Стресс-тестирование Во всех странах Европейского союза: https://www.eba.europa.eu/risk-analysis-and-data/eu-wide-stress-testing