Сравнение кредитного скоринга с использованием деревьев логистической регрессии и принятия решений

В этом примере показан рабочий процесс создания и сравнения двух моделей кредитного скоринга: модель кредитного скоринга, основанная на логистической регрессии, и модель кредитного скоринга, основанная на деревьях решений.

Кредитно-рейтинговые агентства и банки используют модели претендента, чтобы проверить достоверность и качество модели кредитного скоринга. В этом примере базовая модель является логистической регрессионой, а модель претендента является моделью дерева решений.

Логистическая регрессия связывает счет и вероятность дефолта (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));

Figure contains an axes. The axes with title Predictor Importance Estimates Using Logit contains an object of type bar.

Использование деревьев решений для значения предиктора

Когда вы используете деревья решений, можно исследовать предикторную важность, используя 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);

Figure contains an axes. The axes with title Predictor Importance Estimates Using Decision Trees contains an object of type bar.

В этом случае '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'})

Figure contains an axes. The axes with title Predictor Importance Estimates contains 2 objects of type bar. These objects represent 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);

Кривая ROC

Область под приемник кривой рабочей характеристики (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')

Figure contains an axes. The axes with title Receiver Operating Characteristic (ROC) Curve contains 2 objects of type line. These objects represent logit, DT.

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 объект.

  • Чтобы продемонстрировать рабочий процесс, этот пример использует тот же набор данных для настройки моделей и для проверки. Однако, чтобы подтвердить модель, использование отдельной проверки набора данных идеально.

  • Опции масштабирования для деревьев решений недоступны. Чтобы использовать масштабирование, выберите модель, отличную от деревьев решений.

См. также

| | | | | | | | | | | | | | |

Похожие примеры

Подробнее о

Внешние веб-сайты