exponenta event banner

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

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

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

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

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 для построения дерева решений.

Проверка модели

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 (0.30) значения, если алгоритм binning для объекта creditscorecard установлен как 'Split' с Gini в качестве критерия разделения.

  • validatemodel Для функции требуются масштабированные оценки для вычисления метрик и значений проверки. Если используется модель дерева решений, масштабированные оценки недоступны, и необходимо выполнить вычисления вне creditscorecard объект.

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

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

См. также

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

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

Подробнее

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