В этом примере показан поток операций для создания и сравнения двух моделей оценки кредита: модели оценки кредита на основе логистической регрессии и модели оценки кредита на основе деревьев принятия решений.
Рейтинговые агентства и банки используют модели конкурентов для проверки достоверности и благонадежности модели кредитного скоринга. В этом примере базовая модель является моделью логистической регрессии, а модель-претендент - моделью дерева принятия решений.
Логистическая регрессия связывает оценку и вероятность дефолта (PD) через функцию логистической регрессии и является моделью подгонки и оценки по умолчанию при работе с creditscorecard объекты. Тем не менее, деревья принятия решений приобрели популярность в кредитном скоринге и в настоящее время обычно используются для подгонки данных и прогнозирования дефолта. Алгоритмы в деревьях решений следуют нисходящему подходу, где на каждом шаге выбирается переменная, разделяющая набор данных «лучший». «Best» может быть определен по любой из нескольких метрик, включая индекс Джини, значение информации или энтропию. Дополнительные сведения см. в разделе Деревья решений.
В этом примере выполняется следующее:
Используйте модель логистической регрессии и модель дерева принятия решений для извлечения PD.
Проверка модели-претендента путем сравнения значений ключевых метрик между моделью-претендентом и базовой моделью.
Сначала создайте базовую модель с помощью creditscorecard объект и функция логистической регрессии по умолчанию fitmodel. Подогнать creditscorecard объект с использованием полной модели, которая включает в себя все предикторы для алгоритма подгонки модели обобщенной линейной регрессии. Затем вычислите PDs с помощью probdefault. Подробное описание этого потока операций см. в разделе История успеха для анализа кредитных карт показателей.
% Create a creditscorecard object, bin data, and fit a logistic regression model load CreditCardData.mat scl = creditscorecard(data,'IDVar','CustID'); scl = autobinning(scl); scl = fitmodel(scl,'VariableSelection','fullmodel');
Generalized linear regression model:
status ~ [Linear formula with 10 terms in 9 predictors]
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
_________ ________ _________ __________
(Intercept) 0.70246 0.064039 10.969 5.3719e-28
CustAge 0.6057 0.24934 2.4292 0.015131
TmAtAddress 1.0381 0.94042 1.1039 0.26963
ResStatus 1.3794 0.6526 2.1137 0.034538
EmpStatus 0.89648 0.29339 3.0556 0.0022458
CustIncome 0.70179 0.21866 3.2095 0.0013295
TmWBank 1.1132 0.23346 4.7683 1.8579e-06
OtherCC 1.0598 0.53005 1.9994 0.045568
AMBalance 1.0572 0.36601 2.8884 0.0038718
UtilRate -0.047597 0.61133 -0.077858 0.93794
1200 observations, 1190 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 91, p-value = 1.05e-15
% Compute the corresponding probabilities of default
pdL = probdefault(scl);Затем создайте модель претендента. Использование метода Toolbox™ статистики и машинного обучения fitctree для соответствия дерева решений (DT) данным. По умолчанию критерием разделения является индекс разнесения Джини. В этом примере модель является входным аргументом функции и ответом 'status' содержит все предикторы при запуске алгоритма. В этом примере см. пары «имя-значение» в fitctree максимальное количество разбиений, чтобы избежать переоборудования и указать предикторы как категоричные.
% Create and view classification tree CategoricalPreds = {'ResStatus','EmpStatus','OtherCC'}; dt = fitctree(data,'status~CustAge+TmAtAddress+ResStatus+EmpStatus+CustIncome+TmWBank+OtherCC+UtilRate',... 'MaxNumSplits',30,'CategoricalPredictors',CategoricalPreds); disp(dt)
ClassificationTree
PredictorNames: {1x8 cell}
ResponseName: 'status'
CategoricalPredictors: [3 4 7]
ClassNames: [0 1]
ScoreTransform: 'none'
NumObservations: 1200
Дерево решений показано ниже. Вы также можете использовать view функция с аргументом пара имя-значение 'mode' установить в значение 'graph' для визуализации дерева в виде графика.
view(dt)
Decision tree for classification
1 if CustIncome<30500 then node 2 elseif CustIncome>=30500 then node 3 else 0
2 if TmWBank<60 then node 4 elseif TmWBank>=60 then node 5 else 1
3 if TmWBank<32.5 then node 6 elseif TmWBank>=32.5 then node 7 else 0
4 if TmAtAddress<13.5 then node 8 elseif TmAtAddress>=13.5 then node 9 else 1
5 if UtilRate<0.255 then node 10 elseif UtilRate>=0.255 then node 11 else 0
6 if CustAge<60.5 then node 12 elseif CustAge>=60.5 then node 13 else 0
7 if CustAge<46.5 then node 14 elseif CustAge>=46.5 then node 15 else 0
8 if CustIncome<24500 then node 16 elseif CustIncome>=24500 then node 17 else 1
9 if TmWBank<56.5 then node 18 elseif TmWBank>=56.5 then node 19 else 1
10 if CustAge<21.5 then node 20 elseif CustAge>=21.5 then node 21 else 0
11 class = 1
12 if EmpStatus=Employed then node 22 elseif EmpStatus=Unknown then node 23 else 0
13 if TmAtAddress<131 then node 24 elseif TmAtAddress>=131 then node 25 else 0
14 if TmAtAddress<97.5 then node 26 elseif TmAtAddress>=97.5 then node 27 else 0
15 class = 0
16 class = 0
17 if ResStatus in {Home Owner Tenant} then node 28 elseif ResStatus=Other then node 29 else 1
18 if TmWBank<52.5 then node 30 elseif TmWBank>=52.5 then node 31 else 0
19 class = 1
20 class = 1
21 class = 0
22 if UtilRate<0.375 then node 32 elseif UtilRate>=0.375 then node 33 else 0
23 if UtilRate<0.005 then node 34 elseif UtilRate>=0.005 then node 35 else 0
24 if CustIncome<39500 then node 36 elseif CustIncome>=39500 then node 37 else 0
25 class = 1
26 if UtilRate<0.595 then node 38 elseif UtilRate>=0.595 then node 39 else 0
27 class = 1
28 class = 1
29 class = 0
30 class = 1
31 class = 0
32 class = 0
33 if UtilRate<0.635 then node 40 elseif UtilRate>=0.635 then node 41 else 0
34 if CustAge<49 then node 42 elseif CustAge>=49 then node 43 else 1
35 if CustIncome<57000 then node 44 elseif CustIncome>=57000 then node 45 else 0
36 class = 1
37 class = 0
38 class = 0
39 if CustIncome<34500 then node 46 elseif CustIncome>=34500 then node 47 else 1
40 class = 1
41 class = 0
42 class = 1
43 class = 0
44 class = 0
45 class = 1
46 class = 0
47 class = 1
При использовании fitctree, можно настроить аргументы пары «имя-значение» в зависимости от варианта использования. Например, можно задать небольшой минимальный размер листа, который дает лучшее отношение точности (см. Проверка модели), но может привести к переполнению модели.
Дерево решений имеет predict функция, которая при использовании со вторым и третьим аргументом вывода дает ценную информацию.
% Extract probabilities of default
[~,ObservationClassProb,Node] = predict(dt,data);
pdDT = ObservationClassProb(:,2);Этот синтаксис имеет следующие выходные данные:
ObservationClassProb возвращает NumObsоколо-2 массив с классовой вероятностью при всех наблюдениях. Порядок классов такой же, как в dt.ClassName. В этом примере имена классов: [0 1] и хорошая метка по выбору, исходя из того, какой класс имеет наибольшее количество в необработанных данных, 0. Поэтому первый столбец соответствует значениям по умолчанию, а второй столбец - фактическим PD. PDS необходимы позднее в рабочем процессе для оценки или проверки.
Node возвращает NumObsоколо-1 вектор, содержащий номера узлов, соответствующие данным наблюдениям.
При выборе предиктора (или переменной) цель состоит в том, чтобы выбрать как можно меньше предикторов, сохраняя при этом как можно больше информации (точность предсказания) о данных. В creditscorecard класс, fitmodel функция внутренне выбирает предикторы и возвращает p-значения для каждого предиктора. Затем аналитик может, вне creditscorecard , установите порог для этих значений p и выберите предикторы, которые стоит сохранить, и предикторы, которые нужно сбросить. Этот шаг полезен, когда количество предикторов велико.
Обычно обучающие наборы данных используются для выполнения выбора предиктора. Основная цель состоит в том, чтобы найти наилучший набор предикторов для ранжирования клиентов на основе их вероятности дефолта и оценки их PDs.
Важность предиктора связана с понятием веса предиктора, так как вес предиктора определяет, насколько он важен при назначении окончательной оценки, и, следовательно, в PD. Вычисление веса предиктора представляет собой метод обратной огибающей, при котором веса определяются путем деления диапазона точек для каждого предиктора на общий диапазон точек для всего creditscorecard объект. Для получения дополнительной информации об этом потоке операций см. Пример выполнения анализа кредитных карт показателей.
Для этого примера используйте formatpoints с опцией PointsOddsandPDO для масштабирования. Это не необходимый шаг, но он помогает гарантировать, что все точки попадают в желаемый диапазон (то есть неотрицательные точки). PointsOddsandPDO масштабирование означает, что для данного значения TargetPoints и TargetOdds (обычно 2), шансы «двойные», а затем formatpoints решает для параметров масштабирования так, что PDO очки необходимы, чтобы удвоить шансы.
% Choose target points, target odds, and PDO values TargetPoints = 500; TargetOdds = 2; PDO = 50; % Format points and compute points range scl = formatpoints(scl,'PointsOddsAndPDO',[TargetPoints TargetOdds PDO]); [PointsTable,MinPts,MaxPts] = displaypoints(scl); PtsRange = MaxPts - MinPts; disp(PointsTable(1:10,:))
Predictors Bin Points
_______________ _____________ ______
{'CustAge' } {'[-Inf,33)'} 37.008
{'CustAge' } {'[33,37)' } 38.342
{'CustAge' } {'[37,40)' } 44.091
{'CustAge' } {'[40,46)' } 51.757
{'CustAge' } {'[46,48)' } 63.826
{'CustAge' } {'[48,58)' } 64.97
{'CustAge' } {'[58,Inf]' } 82.826
{'CustAge' } {'<missing>'} NaN
{'TmAtAddress'} {'[-Inf,23)'} 49.058
{'TmAtAddress'} {'[23,83)' } 57.325
fprintf('Minimum points: %g, Maximum points: %g\n',MinPts,MaxPts)Minimum points: 348.705, Maximum points: 683.668
Веса определяются как диапазон баллов для любого заданного предиктора, деленный на диапазон баллов для всей карты показателей.
Predictor = unique(PointsTable.Predictors,'stable'); NumPred = length(Predictor); Weight = zeros(NumPred,1); for ii = 1 : NumPred Ind = strcmpi(Predictor{ii},PointsTable.Predictors); MaxPtsPred = max(PointsTable.Points(Ind)); MinPtsPred = min(PointsTable.Points(Ind)); Weight(ii) = 100*(MaxPtsPred-MinPtsPred)/PtsRange; end PredictorWeights = table(Predictor,Weight); PredictorWeights(end+1,:) = PredictorWeights(end,:); PredictorWeights.Predictor{end} = 'Total'; PredictorWeights.Weight(end) = sum(Weight); disp(PredictorWeights)
Predictor Weight
_______________ _______
{'CustAge' } 13.679
{'TmAtAddress'} 5.1564
{'ResStatus' } 8.7945
{'EmpStatus' } 8.519
{'CustIncome' } 19.259
{'TmWBank' } 24.557
{'OtherCC' } 7.3414
{'AMBalance' } 12.365
{'UtilRate' } 0.32919
{'Total' } 100
% Plot a histogram of the weights figure bar(PredictorWeights.Weight(1:end-1)) title('Predictor Importance Estimates Using Logit'); ylabel('Estimates (%)'); xlabel('Predictors'); xticklabels(PredictorWeights.Predictor(1:end-1));

При использовании деревьев решений можно исследовать важность предиктора с помощью predictorImportance функция. На каждом предикторе функция суммирует и нормализует изменения в рисках из-за расщеплений с помощью числа узлов ветвления. Высокое значение в выходном массиве указывает на сильный предиктор.
imp = predictorImportance(dt); figure; bar(100*imp/sum(imp)); % to normalize on a 0-100% scale title('Predictor Importance Estimates Using Decision Trees'); ylabel('Estimates (%)'); xlabel('Predictors'); xticklabels(dt.PredictorNames);

В этом случае 'CustIncome' (родительский узел) является наиболее важным предиктором, за которым следует 'UtilRate', где происходит второй раскол и так далее. Шаг важности предиктора может помочь в скрининге предиктора для наборов данных с большим количеством предикторов.
Обратите внимание, что не только веса в моделях различаются, но и выбранные предикторы в каждой модели также расходятся. Предсказатели 'AMBalance' и 'OtherCC' отсутствуют в модели дерева решений, и 'UtilRate' отсутствует в модели логистической регрессии.
Нормализуйте важность предиктора для деревьев решений, используя процент от 0 до 100%, а затем сравните две модели в комбинированной гистограмме.
Ind = ismember(Predictor,dt.PredictorNames); w = zeros(size(Weight)); w(Ind) = 100*imp'/sum(imp); figure bar([Weight,w]); title('Predictor Importance Estimates'); ylabel('Estimates (%)'); xlabel('Predictors'); h = gca; xticklabels(Predictor) legend({'logit','DT'})

Обратите внимание, что эти результаты зависят от алгоритма объединения, выбранного для creditscorecard и параметры, используемые в fitctree для построения дерева решений.
creditscorecard функция validatemodel попытки вычислить баллы на основе внутренних вычисленных баллов. При использовании деревьев решений невозможно непосредственно выполнить проверку, так как коэффициенты модели неизвестны и не могут быть сопоставлены из PD.
Для проверки creditscorecard используя логистическую регрессию, используйте validatemodel функция.
% Model validation for the creditscorecard
[StatsL,tL] = validatemodel(scl);Для проверки деревьев решений можно непосредственно вычислить статистику, необходимую для проверки.
% Compute the Area under the ROC [x,y,t,AUC] = perfcurve(data.status,pdDT,1); KSValue = max(y - x); AR = 2 * AUC - 1; % Create Stats table output Measure = {'Accuracy Ratio','Area Under ROC Curve','KS Statistic'}'; Value = [AR;AUC;KSValue]; StatsDT = table(Measure,Value);
Область под кривой рабочей характеристики приемника (AUROC) является метрикой производительности для проблем классификации. AUROC измеряет степень разделяемости - то есть насколько модель может различать классы. В этом примере различаемые классы - это классы по умолчанию и классы по умолчанию. Высокая AUROC указывает на хорошую прогностическую способность.
Кривая ROC нанесена на график с истинной положительной скоростью (также известной как чувствительность или отзыв), построенной против ложноположительной скорости (также известной как выпадение или специфичность). Когда AUROC = 0.7, модель имеет 70% шансов правильно различать классы. Когда AUROC = 0.5, модель не имеет силы дискриминации.
На этом графике сравниваются кривые ROC для обеих моделей, использующих один и тот же набор данных.
figure plot([0;tL.FalseAlarm],[0;tL.Sensitivity],'s') hold on plot(x,y,'-v') xlabel('Fraction of nondefaulters') ylabel('Fraction of defaulters') legend({'logit','DT'},'Location','best') title('Receiver Operating Characteristic (ROC) Curve')

tValidation = table(Measure,StatsL.Value(1:end-1),StatsDT.Value,'VariableNames',... {'Measure','logit','DT'}); disp(tValidation)
Measure logit DT
________________________ _______ _______
{'Accuracy Ratio' } 0.32515 0.38903
{'Area Under ROC Curve'} 0.66258 0.69451
{'KS Statistic' } 0.23204 0.29666
Как показывают значения AUROC, учитывая набор данных и выбранный алгоритм объединения для creditscorecard объект, модель дерева решений имеет лучшую прогностическую мощность, чем модель логистической регрессии.
В этом примере сравниваются модели логистической регрессии и оценки дерева решений с помощью CreditCardData.mat набор данных. Представлен рабочий процесс для вычисления и сравнения PD с использованием деревьев решений. Модель дерева решений проверяется и контрастируется с моделью логистической регрессии.
При просмотре результатов помните, что эти результаты зависят от выбора набора данных и алгоритма объединения по умолчанию (монотонный алгоритм смежного объединения) в рабочем процессе логистической регрессии.
Является ли модель логистической регрессии или дерева решений лучшей моделью оценки, зависит от набора данных и выбора алгоритма объединения. Хотя модель дерева решений в этом примере является лучшей моделью оценки, модель логистической регрессии производит более высокое отношение точности (0.42), AUROC (0.71) и статистика KS (0.30) значения, если алгоритм binning для объекта creditscorecard установлен как 'Split' с Gini в качестве критерия разделения.
validatemodel Для функции требуются масштабированные оценки для вычисления метрик и значений проверки. Если используется модель дерева решений, масштабированные оценки недоступны, и необходимо выполнить вычисления вне creditscorecard объект.
Для демонстрации рабочего процесса в этом примере используется один и тот же набор данных для обучения моделей и тестирования. Однако для проверки модели идеально использовать отдельный набор тестовых данных.
Параметры масштабирования для деревьев решений недоступны. Чтобы использовать масштабирование, выберите модель, отличную от деревьев принятия решений.
autobinning | bindata | bininfo | creditscorecard | displaypoints | fitmodel | formatpoints | modifybins | modifypredictor | plotbins | predictorinfo | probdefault | score | screenpredictors | setmodel | validatemodel