В этом примере показан рабочий процесс создания и сравнения двух моделей кредитного скоринга: модель кредитного скоринга, основанная на логистической регрессии, и модель кредитного скоринга, основанная на деревьях решений.
Кредитно-рейтинговые агентства и банки используют модели претендента, чтобы проверить достоверность и качество модели кредитного скоринга. В этом примере базовая модель является логистической регрессионой, а модель претендента является моделью дерева решений.
Логистическая регрессия связывает счет и вероятность дефолта (PD) через функцию логистической регрессии и является моделью подбора кривой и оценки по умолчанию, когда вы работаете с creditscorecard
объекты. Тем не менее, деревья решений приобрели популярность в кредитном скоринге и теперь обычно используются для подгонки данных и прогнозирования дефолта. Алгоритмы в деревьях решений следуют нисходящему подходу, где на каждом шаге выбирается переменная, которая разделяет набор данных «best». «Лучший» может быть определен любой из нескольких метрик, включая индекс Джини, значение информации или энтропию. Для получения дополнительной информации смотрите Деревья решений.
В этом примере вы:
Используйте как логистическую регрессионую модель, так и модель дерева решений для извлечения PD.
Проверьте модель претендента путем сравнения значений ключевых метрик между моделью претендента и базовой моделью.
Во-первых, создайте базовую модель при помощи creditscorecard
объект и функция логистической регрессии по умолчанию fitmodel
. Подбор к creditscorecard
объект при помощи полной модели, которая включает все предикторы для обобщенного алгоритма аппроксимации линейной регрессионой модели. Затем вычислите PD с помощью 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);
Затем создайте модель претендента. Используйте метод Statistics and Machine Learning 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
-by- 2
массив с вероятностью классов при всех наблюдениях. Порядок классов такой же, как и в dt.ClassName
. В этом примере имена классов [0 1]
и хорошая метка, по выбору, основанная на том, какой класс имеет наивысшее количество в необработанных данных, является 0
. Поэтому первый столбец соответствует nondefaults, а второй - фактическим PD. PD необходимы позже в рабочем процессе для оценки или валидации.
Node
возвращает NumObs
-by- 1
вектор, содержащий номера узлов, соответствующие заданным наблюдениям.
При выборе предиктора (или переменной) цель состоит в том, чтобы выбрать как можно меньше предикторов, сохраняя при этом как можно больше информации (прогнозирующей точности) о данных. В creditscorecard
класс, fitmodel
функция внутренне выбирает предикторы и возвращает p-значения для каждого предиктора. Аналитик может тогда, за пределами creditscorecard
рабочий процесс, установите порог для этих p-значений и выберите предикторы, которые стоит сохранить, и предикторы, которые нужно отбросить. Этот шаг полезен, когда количество предикторов велико.
Обычно обучающие наборы данных используются для выполнения выбора предиктора. Ключевая цель состоит в том, чтобы найти лучший набор предикторов для рейтинга клиентов на основе их вероятности дефолта и оценки их PD.
Важность предиктора связана с понятием весов предиктора, поскольку вес предиктора определяет, насколько это важно в присвоении конечного счета, а следовательно, и в PD. Вычисление весов предиктора является обратным методом огибающей, посредством которого веса определяются путем деления области значений точек для каждого предиктора на общую область значений точек для всего creditscorecard
объект. Для получения дополнительной информации об этом рабочем процессе см. Пример для анализа карты показателей кредита.
В данном примере используйте formatpoints
с опцией PointsOddsandPDO
для масштабирования. Это не необходимый шаг, но он помогает гарантировать, что все точки попадают в желаемую область значений (то есть неотрицательные точки). The PointsOddsandPDO
масштабирование означает, что для заданного значения TargetPoints
и TargetOdds
(обычно 2
), шансы «double», а затем 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
создать дерево решений.
The 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 statistic (0.30
) значения, установлен ли алгоритм раскладывания для объекта creditscorecard как 'Split'
с Gini
как критерий разделения.
The validatemodel
функция требует масштабированных счетов для вычисления метрик и значений валидации. Если вы используете модель дерева решений, масштабированные счета недоступны, и вы должны выполнить расчеты вне creditscorecard
объект.
Чтобы продемонстрировать рабочий процесс, этот пример использует тот же набор данных для настройки моделей и для проверки. Однако, чтобы подтвердить модель, использование отдельной проверки набора данных идеально.
Опции масштабирования для деревьев решений недоступны. Чтобы использовать масштабирование, выберите модель, отличную от деревьев решений.
autobinning
| bindata
| bininfo
| creditscorecard
| displaypoints
| fitmodel
| formatpoints
| modifybins
| modifypredictor
| plotbins
| predictorinfo
| probdefault
| score
| screenpredictors
| setmodel
| validatemodel