Интерпретируйте и нейронные сети для глубокого обучения стресс-теста для вероятности значения по умолчанию

В этом примере показано, как обучить кредитный риск вероятности значения по умолчанию (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. Запускать этот пример, вас:

  1. Загрузите и подготовьте данные о кредите, переформатируйте предикторы и разделите данные в обучение, валидацию и тестирующие наборы.

  2. Задайте сетевую архитектуру, выберите опции обучения и обучите сеть. (Сохраненная версия обучившего сеть residualTrainedNetworkMacro доступно для удобства.)

  3. Примените LIME и Шепли interpretability методы на наблюдениях за интересом (или "точки запроса"), чтобы определить, как ожидалось ли важность предикторов в модели.

  4. Исследуйте экстремальный предиктор значения из выборки, чтобы исследовать поведение модели для новых, экстремальных данных.

  5. Используйте модель, чтобы выполнить анализ стресс-тестирования предсказанных значений 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,:);

Архитектура сети Define

Можно использовать различные архитектуры глубокого обучения для задачи предсказания вероятностей значения по умолчанию кредита. Меньшие сети быстры, чтобы обучаться, но более глубокие сети могут узнать больше абстрактные функции. Выбор архитектуры нейронной сети требует балансирующегося времени вычисления против точности. Этот пример использует остаточную архитектуру. Для примера других сетей смотрите Сравнить Нейронные сети для глубокого обучения для примера Предсказания Значения по умолчанию Кредита.

Создайте остаточную архитектуру (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) и метод Шепли обе цели объяснить поведение модели при конкретном наблюдении за интересом или "точкой запроса". А именно, эти методы помогают вам изучить важность каждой переменной в предсказании, сделанном для конкретного наблюдения. Для получения дополнительной информации смотрите 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 баллы, относительное увеличение с базовой линии, к первому экстремальному сценарию, затем к второму крайнему случаю, малы. Этот результат предлагает неявный верхний предел в ожидаемых значениях в структуре модели. Экстремальные сценарии в этом осуществлении кажутся маловероятными произойти, однако, для экстремальных но вероятных сценариев, это поведение потребовало бы расследования со стресс-тестированием.

Стресс-тест предсказанные вероятности значения по умолчанию (PD)

Поскольку модель включает макроэкономические переменные, она может использоваться, чтобы выполнить анализ стресс-тестирования (см., например [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

Смотрите также

| | | |

Связанные примеры

Больше о