В этом примере показано, как обучить кредитный риск вероятности значения по умолчанию (PD) предсказание с помощью глубокой нейронной сети. Пример также показывает, как использовать локально поддающиеся толкованию объяснения модели агностические (LIME) и значения Шепли interpretability методы, чтобы изучить предсказания модели. Кроме того, пример анализирует предсказания модели для значений из выборки и выполняет анализ стресс-тестирования.
Стресс-тестирование Вероятностей Значения по умолчанию Потребительского кредита Используя Данные о Панели (Risk Management Toolbox) пример представляет подобный рабочий процесс, но использует логистическую модель. Вероятности Моделирования Значения по умолчанию с Cox Пропорциональные Опасности (Risk Management Toolbox) пример используют регрессию Cox или Cox пропорциональная модель опасностей. Однако методы interpretability не обсуждены ни в одном из этих примеров, потому что модели являются более простыми и поддающимися толкованию. Сравнить Нейронные сети для глубокого обучения для примера Предсказания Значения по умолчанию Кредита фокусируются на альтернативных проектированиях сети и подбирают более простые модели без макроэкономических переменных.
В то время как можно использовать эти альтернативные, более простые модели успешно, чтобы смоделировать кредитный риск, этот пример вводит explainability инструменты для исследования комплексных техник моделирования в заявках на кредит. Чтобы визуализировать и интерпретировать предсказания модели, вы используете Deep Learning Toolbox™ и lime
(Statistics and Machine Learning Toolbox) и shapley
Функции Statistics and Machine Learning Toolbox. Запускать этот пример, вас:
Загрузите и подготовьте данные о кредите, переформатируйте предикторы и разделите данные в обучение, валидацию и тестирующие наборы.
Задайте сетевую архитектуру, выберите опции обучения и обучите сеть. (Сохраненная версия обучившего сеть 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,:);
Можно использовать различные архитектуры глубокого обучения для задачи предсказания вероятностей значения по умолчанию кредита. Меньшие сети быстры, чтобы обучаться, но более глубокие сети могут узнать больше абстрактные функции. Выбор архитектуры нейронной сети требует балансирующегося времени вычисления против точности. Этот пример использует остаточную архитектуру. Для примера других сетей смотрите Сравнить Нейронные сети для глубокого обучения для примера Предсказания Значения по умолчанию Кредита.
Создайте остаточную архитектуру (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 или analyzeNetwork
функция.
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);
Сравнить Нейронные сети для глубокого обучения для примера Предсказания Значения по умолчанию Кредита соответствуют тому же типу сети, но это исключает макроэкономические предикторы. В том примере, если вы увеличиваете число эпох от 50
к 75
, можно улучшить точность, не сверхсоответствуя проблемам.
Можно выполнить оптимизацию программно или в интерактивном режиме использование Experiment Manager. Для примера, показывающего, как выполнить развертку гиперпараметра опций обучения, смотрите, Создают Эксперимент Глубокого обучения для Классификации.
Обучите сеть с помощью архитектуры, которая по сравнению с предыдущим годом задала, обучающие данные и опции обучения. По умолчанию, analyzeNetwork
использует графический процессор, если вы доступны; в противном случае это использует центральный процессор. Обучение на графическом процессоре требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент значения имени trainingOptions
.
Чтобы постараться не ожидать обучения, загрузите предварительно обученные сети путем установки doTrain
отметьте к false
. Обучать сети с помощью analyzeNetwork
, установите 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
функция, чтобы предсказать вероятность по умолчанию тестовых данных с помощью обучившего нейронные сети.
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
(Statistics and Machine Learning Toolbox) и shapley
Функции Statistics and Machine Learning Toolbox. Затем это исследует поведение модели в новых значениях данных (из выборки). Наконец, пример использует модель, чтобы предсказать значения PD при подчеркнутых макроэкономических условиях, также известных как стресс-тестирование.
Метод локальных поддающихся толкованию объяснений модели агностических (LIME) и метод Шепли обе цели объяснить поведение модели при конкретном наблюдении за интересом или "точкой запроса". А именно, эти методы помогают вам изучить важность каждой переменной в предсказании, сделанном для конкретного наблюдения. Для получения дополнительной информации смотрите lime
(Statistics and Machine Learning Toolbox) и shapley
(Statistics and Machine Learning Toolbox).
В целях рисунка выберите два наблюдения из данных, чтобы лучше интерпретировать предсказания модели. Значения отклика (последний столбец) не нужны.
Первое наблюдение является закаленной ссудой с низким риском. Другими словами, это имеет начальный счет 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
(Statistics and Machine Learning Toolbox) и shapley
(Statistics and Machine Learning Toolbox) требует набора справочных данных со значениями предиктора. Эти справочные данные могут быть обучающими данными сами или любыми другими справочными данными, где модель может быть оценена, чтобы исследовать поведение модели. Больше точек данных позволяет explainability методам изучать поведение модели в большем количестве областей. Однако большой набор данных может также замедлить расчеты, особенно для shapley
(Statistics and Machine Learning Toolbox). В целях рисунка используйте первые 1 000 строк от обучающего набора данных. Значения отклика (последний столбец) не нужны.
predictorData = data(1:1000,1:end-1);
lime
(Statistics and Machine Learning Toolbox) и shapley
(Statistics and Machine Learning Toolbox) также требует указателя на функцию к predict
функция. Обработайте predict
как модель черного ящика и вызов это многократно, чтобы сделать предсказания на данных и собрать информацию о поведении модели.
blackboxFcn = @(x)predict(residualNetMacro,x);
lime
ОбъектСоздайте lime
Объект (Statistics and Machine Learning Toolbox) путем передачи указателя на функцию черного ящика и выбранных данных о предикторе.
Случайным образом сгенерированные синтетические данные, лежащие в основе lime
(Statistics and Machine Learning Toolbox) может влиять на важность. Отчет может измениться в зависимости от синтетических сгенерированных данных. Это может также измениться из-за дополнительных аргументов, таких как '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
(Statistics and Machine Learning Toolbox) результаты весьма схож для обоих наблюдений. Информация в графиках показывает, что наиболее важными переменными является High
Risk
и Medium
Risk
переменные. High
Risk
и Medium
Risk
способствуйте положительно более высоким вероятностям значения по умолчанию. С другой стороны, YOB,
LowRisk
, GDP
, и Market
имейте отрицательный вклад в вероятность по умолчанию. Market
переменная, кажется, не способствует так же как другие переменные. Значения в графиках являются коэффициентами простой модели, подбиравшей вокруг интересного места, таким образом, значения могут быть интерпретированы как чувствительность PD к различным предикторам, и эти результаты, кажется, выравниваются с ожиданиями. Например, предсказания PD уменьшаются как YOB
значение (возраст ссуды) увеличения, сопоставимые с тенденцией к понижению, наблюдаемой в модели приспособленный график в разделе Test Network.
shapley
ОбъектШаги для создания shapley
Объект (Statistics and Machine Learning Toolbox) эквивалентен для lime
(Statistics and Machine Learning Toolbox). Создайте shapley
Объект (Statistics and Machine Learning Toolbox) путем передачи указателя на функцию черного ящика и данных о предикторе, выбранных ранее.
shapley
(Statistics and Machine Learning Toolbox) анализ может также быть затронут случайным образом сгенерированными данными, и это требует, чтобы различные методы управляли симуляциями, требуемыми для анализа. В целях рисунка создайте shapley
Объект (Statistics and Machine Learning Toolbox) с настройками по умолчанию.
explainerShapley = shapley(blackboxFcn,predictorData);
Найдите и постройте важность предикторов для каждой точки запроса. shapley
(Statistics and Machine Learning Toolbox) более в вычислительном отношении интенсивен, чем lime
(Statistics and Machine Learning Toolbox). Как количество строк в увеличениях данных о предикторе, вычислительное время для shapley
(Statistics and Machine Learning Toolbox) заканчивается увеличения. Для больших наборов данных, с помощью параллельных вычислений рекомендуется (см. 'UseParallel'
опция в shapley
(Statistics and Machine Learning Toolbox)).
explainerShapleyObs1 = fit(explainerShapley, obs1); explainerShapleyObs2 = fit(explainerShapley, obs2); figure; subplot(2,1,1) plot(explainerShapleyObs1) subplot(2,1,2) plot(explainerShapleyObs2)
В этом случае результаты выглядят по-другому для этих двух наблюдений. shapley
(Statistics and Machine Learning Toolbox) результаты объясняет отклонения от среднего предсказания PD. Для первого наблюдения, которое является наблюдением очень с низким риском, ожидаемым значением является значительно ниже среднего PD Поэтому весь shapley
(Statistics and Machine Learning Toolbox) значения отрицателен с YOB
будучи наиболее важной переменной в этом случае, сопровождаемый LowRisk
. Для второго наблюдения, которое является наблюдением очень высокого риска, большей частью shapley
(Statistics and Machine Learning Toolbox) значения положителен с 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
.
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
функция, чтобы предсказать значения 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
trainNetwork
| trainingOptions
| fullyConnectedLayer
| Deep Network Designer | featureInputLayer