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

На следующей диаграмме показан типичный процесс построения модели карты показателей. Красная рамка представляет процесс вывода отклонения, в котором оценивается производительность ранее отклоненных заявок, а затем используется для повторного обучения модели кредитной карты показателей.

Поток операций для процесса вывода отклонения:
Создайте модель логистической регрессии на основе принятых.
Выведите класс отклонений, используя один из методов вывода отклонений.
Объединение приемок и отклонений в один набор данных.
Создайте новую карту показателей, складируйте расширенный набор данных и создайте новую логистическую модель.
Проверьте окончательную модель.
Существует два типа вывода отклонения:
Простое назначение не использует процесс вывода отклонения и либо игнорирует отклонение, либо назначает все отклонения плохому классу.
В дополнении используется процесс вывода отклонения для обработки отклонений на основе модели оценки путем объединения исходного набора данных с данными отклонения.
В этом примере основное внимание уделяется методам увеличения. Наиболее популярными методами увеличения являются:
Простое увеличение - с помощью значения отсечки этот метод присваивает отклонениям с баллами ниже и выше значения «плохой» или «хороший» класс соответственно. Пороговое значение должно отражать, что скорость bad в отклонениях выше, чем в принятой популяции. После присвоения отклонениям класса («хороший» или «плохой») вся совокупность принятых и отклоненных элементов устанавливается в модели кредитной карты показателей, а затем оценивается. Этот подход также называют техникой жесткого отсечения.
Нечеткое увеличение - этот метод оценивает отклонения с помощью модели кредитной карты показателей на основе принятых. Эти отклонения дублируются на два наблюдения, где каждому присваивается вероятность быть «хорошим» или «плохим», а затем агрегируются для принимающих. Затем на новом наборе данных оценивается новая модель кредитной карты показателей.
В этом примере представлены следующие рабочие процессы:
Оба этих подхода используют правила привязки, сохраненные из исходной карты показателей, и применяют их к новой карте показателей, основанной на объединенном наборе данных.
Примечание.Наборы данных в этом примере представляют собой технически сквозные (TTD) наблюдения. То есть, принятия и отклонения объединяются и дифференцируются на основании их принятия или отклонения решения. Затем из наблюдений TTD создается набор данных отклонения.
Метод жесткого отсечения использует предопределенное значение отсечения и назначает отклонения ниже отсечения как «плохие», а выше отсечения как «хорошие». Значение отсечки должно отражать, что скорость «bads» в отклонениях выше, чем в приемках. После присвоения каждому отклонению класса («хороший» или «плохой») вся совокупность принимаемых и отклоняемых данных помещается в модель кредитной карты показателей, а затем эта модель оценивается и проверяется. Этот подход также называют простой техникой увеличения. Основной задачей в этом подходе является выбор значения отсечки.
Сначала визуализируйте данные для принятия и отклонения для выбранного предиктора.
% Load the data load CreditCardData.mat load RejectsCreditCardData.mat Predictor ="CustAge"; figure; h1 = histogram(data.(Predictor)); hold on h2 = histogram(Rejects.(Predictor)); h1.Normalization = 'probability'; h2.Normalization = 'probability'; title(Predictor) xlabel('Predictor Values') ylabel('Normalized Count by Probability') hold off legend({'Accepts','Rejects'},'Location','best');

creditscorecard Объект для принятия и оценки данныхИспользовать creditscorecard для создания creditscorecard объект, который можно использовать для складирования, подгонки, а затем оценки принятых объектов.
scHC = creditscorecard(data,'IDVar','CustID'); scHC = autobinning(scHC); scHC = fitmodel(scHC);
1. Adding CustIncome, Deviance = 1490.8527, Chi2Stat = 32.588614, PValue = 1.1387992e-08
2. Adding TmWBank, Deviance = 1467.1415, Chi2Stat = 23.711203, PValue = 1.1192909e-06
3. Adding AMBalance, Deviance = 1455.5715, Chi2Stat = 11.569967, PValue = 0.00067025601
4. Adding EmpStatus, Deviance = 1447.3451, Chi2Stat = 8.2264038, PValue = 0.0041285257
5. Adding CustAge, Deviance = 1441.994, Chi2Stat = 5.3511754, PValue = 0.020708306
6. Adding ResStatus, Deviance = 1437.8756, Chi2Stat = 4.118404, PValue = 0.042419078
7. Adding OtherCC, Deviance = 1433.707, Chi2Stat = 4.1686018, PValue = 0.041179769
Generalized linear regression model:
status ~ [Linear formula with 8 terms in 7 predictors]
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ ______ __________
(Intercept) 0.70239 0.064001 10.975 5.0538e-28
CustAge 0.60833 0.24932 2.44 0.014687
ResStatus 1.377 0.65272 2.1097 0.034888
EmpStatus 0.88565 0.293 3.0227 0.0025055
CustIncome 0.70164 0.21844 3.2121 0.0013179
TmWBank 1.1074 0.23271 4.7589 1.9464e-06
OtherCC 1.0883 0.52912 2.0569 0.039696
AMBalance 1.045 0.32214 3.2439 0.0011792
1200 observations, 1192 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 89.7, p-value = 1.4e-16
ScoreRange = [300 850];
scHC = formatpoints(scHC,'WorstAndBestScores',ScoreRange);
ScoresAccepts = score(scHC);Отклонение является «» хорошим «» или «» плохим «» на основе указанного значения плохой скорости (BR). В целом, индустрия кредитного скоринга предполагает, что отклонение имеет BR 75%. Это субъективная оценка, которая обычно основана на неизвестном значении. В этом примере можно настроить значение BR.
CreditCardData.mat входные данные имеют 'status' в качестве ответа. Предположим, что GoodLabel (что означает nondefault) - класс с более высоким числом в ответе. В этом примере: GoodLabel является 0, что означает, что по умолчанию происходит только тогда, когда ответ равен 1.
% Define the BR BR =0.75; % Sort rejects by ascending CustID order N = height(Rejects); Rejects = sortrows(Rejects); ScoresRejects = score(scHC,Rejects); % Find the lowest quantile based on the BR and set the corresponding observations to bad BadLabel = setdiff(unique(scHC.Data.(scHC.ResponseVar)),scHC.GoodLabel); ScoreThres = quantile(ScoresRejects,BR); ResponseRejects = zeros(N,1); ResponseRejects(ScoresRejects < ScoreThres) = BadLabel; ResponseRejects(ScoresRejects >= ScoreThres) = scHC.GoodLabel; % Create the rejects table RejectsTable = [Rejects table(ResponseRejects,'VariableNames',{scHC.ResponseVar})];
Чтобы провести более точное сравнение между приемками и объединенным набором данных, используйте те же правила привязки из исходной карты показателей принятия кредита и скопируйте их в creditscorecard на основе комбинированного набора данных. Это гарантирует, что присвоение binning не повлияет на последующее сравнение двух моделей кредитных карт показателей. Кроме того, можно визуализировать распределение отклонений в диапазоне данных каждого предиктора.
% Create the final combined scorecard CombinedData = [data(:,2:end);RejectsTable(:,2:end)]; scNewHC = creditscorecard(CombinedData,'GoodLabel',0); % Bin using the same binning rules as the base scorecard Predictors = scHC.PredictorVars; Edges = struct(); for i = 1 : length(Predictors) Pred = Predictors{i}; [bi,cp] = bininfo(scHC,Pred); if ismember(Pred,scHC.NumericPredictors) scNewHC = modifybins(scNewHC,Pred,'CutPoints',cp); else scNewHC = modifybins(scNewHC,Pred,'CatGrouping',cp); end Edges.(Pred) = bi.Bin(1:end-1); end % Visualize the rejects distribution in each bin bd1 = bindata(scHC,data); bd2 = bindata(scHC,CombinedData); Predictor ="CustAge"; figure; bar(categorical(Edges.(Predictor)),histcounts(bd1.(Predictor))) hold on bar(categorical(Edges.(Predictor)),histcounts(bd2.(Predictor)),'FaceAlpha',0.25) hold off xlabel('Bins') ylabel('Counts') legend({'Accepts Only','Combined'},'Location','best')

Сравнение начального creditscorecard объект (scHC) к новому creditscorecard объект (scNewHC) для распределения «товаров» и «бад» для выбранного предиктора.
plotbins(scHC,Predictor);

plotbins(scNewHC,Predictor);

Подгонка модели логистической регрессии для creditscorecard объект scNewHC а затем набрать балл scNewHC.
scNewHC = fitmodel(scNewHC);
1. Adding CustIncome, Deviance = 1693.9882, Chi2Stat = 114.39516, PValue = 1.0676416e-26
2. Adding TmWBank, Deviance = 1650.6615, Chi2Stat = 43.326628, PValue = 4.6323638e-11
3. Adding AMBalance, Deviance = 1623.0668, Chi2Stat = 27.594773, PValue = 1.4958244e-07
4. Adding EmpStatus, Deviance = 1603.603, Chi2Stat = 19.463733, PValue = 1.0252802e-05
5. Adding CustAge, Deviance = 1592.3467, Chi2Stat = 11.256272, PValue = 0.00079354409
6. Adding ResStatus, Deviance = 1582.0086, Chi2Stat = 10.338134, PValue = 0.0013030966
7. Adding OtherCC, Deviance = 1572.1, Chi2Stat = 9.9086387, PValue = 0.0016450476
Generalized linear regression model:
status ~ [Linear formula with 8 terms in 7 predictors]
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ ______ __________
(Intercept) 0.48115 0.061301 7.849 4.1925e-15
CustAge 0.50857 0.14449 3.5197 0.00043207
ResStatus 1.151 0.34773 3.3101 0.00093262
EmpStatus 0.78527 0.17826 4.4051 1.0572e-05
CustIncome 0.68743 0.12372 5.5563 2.7555e-08
TmWBank 1.0001 0.16731 5.9779 2.2607e-09
OtherCC 0.97659 0.30956 3.1548 0.0016062
AMBalance 0.91563 0.19073 4.8006 1.5819e-06
1361 observations, 1353 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 236, p-value = 2.29e-47
scNewHC = formatpoints(scNewHC,'WorstAndBestScores',ScoreRange); Scores = score(scNewHC); % Visualize the score distribution histogram(ScoresAccepts) hold on histogram(Scores,'FaceAlpha',0.25) hold off ylabel('Counts') xlabel('Scores') title(sprintf('Score Distribution for a BR = %.2f',BR)) legend({'Accepts Only','Combined'},'Location','best')

Перед проверкой необходимо скорректировать набор данных. Для корректировки набора данных можно выполнить одно из следующих действий:
Проверка приемок для обеих карт показателей
Проверка объединенного набора данных для обеих карт показателей
% Get statistics for the accepts StatsA1 = validatemodel(scHC); StatsA2 = validatemodel(scNewHC,data); % Get the statistics for the combined data set StatsC1 = validatemodel(scHC,CombinedData); StatsC2 = validatemodel(scNewHC); s1 = table(StatsA1.Value,StatsA2.Value,'VariableNames',{'BaseScorecard','CombinedScorecard'}); s2 = table(StatsC1.Value,StatsC2.Value,'VariableNames',{'BaseScorecard','CombinedScorecard'}); Stats = table(StatsA1.Measure,s1,s2,'VariableNames',{'Measure','Accepts','Combined'}); disp(Stats)
Measure Accepts Combined
BaseScorecard CombinedScorecard BaseScorecard CombinedScorecard
________________________ __________________________________ __________________________________
{'Accuracy Ratio' } 0.32258 0.31695 0.47022 0.46565
{'Area under ROC curve'} 0.66129 0.65848 0.73511 0.73282
{'KS statistic' } 0.2246 0.22946 0.34528 0.33681
{'KS score' } 550.72 576.57 512.44 542.85
Метод увеличения Fuzzy начинается с построения карты показателей с использованием только accepts, а затем эта модель карты показателей используется для оценки отклонений. В отличие от техники жесткого отсечения, подход нечеткого увеличения не присваивает «хорошие» или «плохие» классы. Скорее, каждый отказ дублируется на два наблюдения и присваивается взвешенное «хорошее» или «плохое» значение, основанное на вероятности быть «хорошим» или «плохим». Взвешенные отклонения затем добавляются к набору данных принятия, и объединенный набор данных используется для создания карты показателей, которая затем подгоняется и проверяется.
Сначала визуализируйте данные для принятия и отклонения для выбранного предиктора.
% Load the data matFileName = fullfile(matlabroot,'toolbox','finance','findemos','CreditCardData'); load(matFileName) load RejectsCreditCardData.mat Predictor ="CustAge"; figure; h1 = histogram(data.(Predictor)); hold on h2 = histogram(Rejects.(Predictor)); h1.Normalization = 'probability'; h2.Normalization = 'probability'; title(Predictor) xlabel('Predictor values') ylabel('Normalized Count by Probability') hold off legend({'Accepts','Rejects'},'Location','best');

creditscorecard Объект для принятия и оценки данныхИспользовать creditscorecard для создания creditscorecard объект для приемок, который можно складировать, подгонять, а затем набирать.
scFA = creditscorecard(data,'IDVar','CustID'); scFA = autobinning(scFA); scFA = fitmodel(scFA);
1. Adding CustIncome, Deviance = 1490.8527, Chi2Stat = 32.588614, PValue = 1.1387992e-08
2. Adding TmWBank, Deviance = 1467.1415, Chi2Stat = 23.711203, PValue = 1.1192909e-06
3. Adding AMBalance, Deviance = 1455.5715, Chi2Stat = 11.569967, PValue = 0.00067025601
4. Adding EmpStatus, Deviance = 1447.3451, Chi2Stat = 8.2264038, PValue = 0.0041285257
5. Adding CustAge, Deviance = 1441.994, Chi2Stat = 5.3511754, PValue = 0.020708306
6. Adding ResStatus, Deviance = 1437.8756, Chi2Stat = 4.118404, PValue = 0.042419078
7. Adding OtherCC, Deviance = 1433.707, Chi2Stat = 4.1686018, PValue = 0.041179769
Generalized linear regression model:
status ~ [Linear formula with 8 terms in 7 predictors]
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ ______ __________
(Intercept) 0.70239 0.064001 10.975 5.0538e-28
CustAge 0.60833 0.24932 2.44 0.014687
ResStatus 1.377 0.65272 2.1097 0.034888
EmpStatus 0.88565 0.293 3.0227 0.0025055
CustIncome 0.70164 0.21844 3.2121 0.0013179
TmWBank 1.1074 0.23271 4.7589 1.9464e-06
OtherCC 1.0883 0.52912 2.0569 0.039696
AMBalance 1.045 0.32214 3.2439 0.0011792
1200 observations, 1192 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 89.7, p-value = 1.4e-16
ScoreRange = [300 850];
scFA = formatpoints(scFA,'WorstAndBestScores',ScoreRange);
ScoresAccepts = score(scFA);% Load the rejects dataset and score the observations load RejectsCreditCardData.mat ScoresRejects = score(scFA,Rejects); % Compute the probabilities of default and use as weights pdRejects = probdefault(scFA,Rejects); % Assign bad status to pd (probability of default) and good status to 1-pd weights BadLabel = setdiff(unique(scFA.Data.(scFA.ResponseVar)),scFA.GoodLabel); Weights = zeros(2*length(pdRejects),1); Response = zeros(2*length(pdRejects),1); Weights(1:2:end) = pdRejects; Response(1:2:end) = BadLabel; Weights(2:2:end) = 1-pdRejects; Response(2:2:end) = scFA.GoodLabel; % Rearrange the response so that each two rows correspond to the same % observation from rejects RejectsTable = repelem(Rejects(:,2:end),2,1); RejectsTable = addvars(RejectsTable,Weights,Response,'NewVariableNames',... {'Weights',scFA.ResponseVar}); % Combine accepts and rejects AcceptsData = addvars(data,ones(height(data),1),'Before',scFA.ResponseVar,... 'NewVariableNames','Weights'); CombinedData = [AcceptsData(:,2:end);RejectsTable];
Чтобы провести более точное сравнение между приемками и объединенным набором данных, используйте те же правила привязки из исходной карты показателей принятия кредита и скопируйте их в creditscorecard на основе комбинированного набора данных. Это гарантирует, что присвоения binning не повлияют на последующее сравнение двух моделей кредитных карт показателей. Кроме того, можно визуализировать распределение отклонений в диапазоне данных каждого предиктора.
scNewFA = creditscorecard(CombinedData,'GoodLabel',0,'WeightsVar','Weights'); % Bin using the same binning rules as the base scorecard Predictors = scFA.PredictorVars; Edges = struct(); for i = 1 : length(Predictors) Pred = Predictors{i}; [bi,cp] = bininfo(scFA,Pred); if ismember(Pred,scFA.NumericPredictors) scNewFA = modifybins(scNewFA,Pred,'CutPoints',cp); else scNewFA = modifybins(scNewFA,Pred,'CatGrouping',cp); end Edges.(Pred) = bi.Bin(1:end-1); end % Visualize the rejects distribution in each bin bd1 = bindata(scFA,data); bd2 = bindata(scFA,CombinedData); Predictor ="CustAge"; figure; bar(categorical(Edges.(Predictor)),histcounts(bd1.(Predictor))) hold on bar(categorical(Edges.(Predictor)),histcounts(bd2.(Predictor)),'FaceAlpha',0.25) hold off xlabel('Bins') ylabel('Counts') legend({'Accepts Only','Combined'},'Location','best')

Сравнение начального creditscorecard объект (scFA) к новому creditscorecard объект (scNewFA) для распределения «товаров» и «бад» для выбранного предиктора.
plotbins(scFA,Predictor);

plotbins(scNewFA,Predictor);

Подгонка модели логистической регрессии для creditscorecard объект scNewFA а затем набрать балл scNewFA.
scNewFA = fitmodel(scNewFA);
1. Adding CustIncome, Deviance = 1711.3102, Chi2Stat = 54.160619, PValue = 1.8475277e-13
2. Adding TmWBank, Deviance = 1682.5353, Chi2Stat = 28.774866, PValue = 8.1299351e-08
3. Adding AMBalance, Deviance = 1668.2956, Chi2Stat = 14.239727, PValue = 0.00016093686
4. Adding EmpStatus, Deviance = 1658.2944, Chi2Stat = 10.001236, PValue = 0.001564352
5. Adding CustAge, Deviance = 1652.3976, Chi2Stat = 5.8967925, PValue = 0.015168483
6. Adding OtherCC, Deviance = 1647.7632, Chi2Stat = 4.6344022, PValue = 0.031337059
7. Adding ResStatus, Deviance = 1642.8332, Chi2Stat = 4.9299914, PValue = 0.026394448
Generalized linear regression model:
status ~ [Linear formula with 8 terms in 7 predictors]
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ ______ __________
(Intercept) 0.60838 0.059654 10.198 2.0142e-24
CustAge 0.50755 0.20092 2.5262 0.011532
ResStatus 1.082 0.48919 2.2119 0.026971
EmpStatus 0.74776 0.23526 3.1784 0.0014809
CustIncome 0.6372 0.17519 3.6371 0.00027567
TmWBank 0.96561 0.19664 4.9106 9.0815e-07
OtherCC 0.90699 0.40476 2.2408 0.025039
AMBalance 0.87642 0.25404 3.4499 0.00056077
1522 observations, 1514 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 123, p-value = 2.16e-23
scNewFA = formatpoints(scNewFA,'WorstAndBestScores',ScoreRange); Scores = score(scNewFA); pd = probdefault(scNewFA); % Visualize the score distribution histogram(ScoresAccepts) hold on histogram(Scores,'FaceAlpha',0.25) hold off ylabel('Counts') xlabel('Scores') title('Score Distribution Using Fuzzy Augmentation') legend({'Accepts Only','Combined'},'Location','best')

Перед проверкой необходимо скорректировать набор данных. Для корректировки набора данных можно выполнить одно из следующих действий:
Проверка приемок для обеих карт показателей
Проверка объединенного набора данных для обеих карт показателей
% Get statistics for the accepts data.Weights = ones(height(data),1); StatsA1 = validatemodel(scFA); StatsA2 = validatemodel(scNewFA,data); % Get the statistics for the combined data set StatsC1 = validatemodel(scFA,CombinedData); StatsC2 = validatemodel(scNewFA); s1 = table(StatsA1.Value,StatsA2.Value,'VariableNames',{'BaseScorecard','CombinedScorecard'}); s2 = table(StatsC1.Value,StatsC2.Value,'VariableNames',{'BaseScorecard','CombinedScorecard'}); Stats = table(StatsA1.Measure,s1,s2,'VariableNames',{'Measure','Accepts','Combined'}); disp(Stats)
Measure Accepts Combined
BaseScorecard CombinedScorecard BaseScorecard CombinedScorecard
________________________ __________________________________ __________________________________
{'Accuracy Ratio' } 0.32258 0.32088 0.29419 0.35143
{'Area under ROC curve'} 0.66129 0.66044 0.64709 0.67571
{'KS statistic' } 0.2246 0.22799 0.22596 0.25629
{'KS score' } 550.72 554.84 512.44 520.99
В этом примере показано, как использовать процесс вывода отклонения в рамках потока операций кредитной карты показателей. Методы Hard-Cutoff и Fuzzy Augmentation показывают, как можно складировать данные, подгонять модель, интегрировать отклонения с приемками в новую модель кредитной карты показателей, а затем проверить новую модель кредитной карты показателей.
Нет четкого вывода о том, какой из этих подходов к отказу является наилучшим. Этот пример предназначен для иллюстрации использования функций creditscorecard реализовать два различных подхода к выводу об отклонении.
Баесн, Б., Д. Рёш и Х. Шёле. Анализ кредитных рисков: методы измерения, приложения и примеры в SAS. Wiley and SAS Business Series, 2016.
Рефаат, М. Карты оценки кредитных рисков: разработка и внедрение с использованием SAS. lulu.com, 2011.
autobinning | bindata | bininfo | creditscorecard | displaypoints | fitmodel | formatpoints | modifybins | modifypredictor | plotbins | predictorinfo | probdefault | score | screenpredictors | setmodel | validatemodel