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

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

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

Логистическая регрессия соединяет счет и вероятность значения по умолчанию (PD) через функцию логистической регрессии, и является подбором кривой значения по умолчанию и выигрышем модели, когда вы работаете с creditscorecard объекты. Однако деревья решений завоевали популярность в рейтинге кредитоспособности и теперь обычно используются, чтобы соответствовать данным и предсказать значение по умолчанию. Алгоритмы в деревьях решений следуют за нисходящим подходом, где на каждом шаге переменная, которая разделяет набор данных "лучше всего", выбрана. "Лучше всего" может быть задан любой из нескольких метрик, включая индекс Gini, информационное значение или энтропию. Для получения дополнительной информации смотрите Деревья решений (Statistics and Machine Learning Toolbox).

В этом примере, вас:

  • Используйте и модель логистической регрессии и модель дерева принятия решения, чтобы извлечь ФУНТЫ.

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

Вычислите вероятности значения по умолчанию Используя логистическую регрессию

Во-первых, создайте базовую модель при помощи creditscorecard возразите и функция логистической регрессии по умолчанию fitmodel. Соответствуйте creditscorecard объект при помощи полной модели, которая включает все предикторы для обобщенного линейного алгоритма подбора модели регрессии. Затем вычислите ФУНТЫ с помощью probdefault. Для подробного описания этого рабочего процесса смотрите Тематическое исследование для Анализа Протокола результатов Кредита (Financial Toolbox).

% 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 CustAge<21.5 then node 18 elseif CustAge>=21.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  class = 0
19  if CustAge<24.5 then node 30 elseif CustAge>=24.5 then node 31 else 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  if TmWBank<56.5 then node 40 elseif TmWBank>=56.5 then node 41 else 0
32  class = 0
33  if UtilRate<0.635 then node 42 elseif UtilRate>=0.635 then node 43 else 0
34  if CustAge<49 then node 44 elseif CustAge>=49 then node 45 else 1
35  if CustIncome<57000 then node 46 elseif CustIncome>=57000 then node 47 else 0
36  class = 1
37  class = 0
38  class = 0
39  if CustIncome<34500 then node 48 elseif CustIncome>=34500 then node 49 else 1
40  class = 0
41  class = 1
42  class = 1
43  class = 0
44  class = 1
45  class = 0
46  class = 0
47  class = 1
48  class = 0
49  class = 1

Когда вы используете fitctree, можно настроить Аргументы в виде пар имя-значение (Statistics and Machine Learning Toolbox) в зависимости от варианта использования. Например, можно установить небольшой минимальный листовой размер, который дает к лучшему отношению точности (см. Проверку допустимости модели), но может привести к сверхподобранной модели.

Дерево решений имеет predict функция, что, когда используется со вторым и третьим выходным аргументом, дает ценную информацию.

% Extract probabilities of default
[~,ObservationClassProb,Node] = predict(dt,data);
pdDT = ObservationClassProb(:,2);

Этот синтаксис имеет следующие выходные параметры:

  • ObservationClassProb возвращает NumObs x2 массив с вероятностью класса при всех наблюдениях. Порядок классов эквивалентен в dt.ClassName. В этом примере именами классов является [0 1] и хорошей меткой, по выбору, на основе которого класс имеет самое высокое количество в необработанных данных, является 0. Поэтому первый столбец соответствует незначениям по умолчанию и второму столбцу к фактическим ФУНТАМ, ФУНТЫ необходимы позже в рабочем процессе для выигрыша или валидации.

  • Node возвращает NumObs x1 вектор, содержащий числа узла, соответствующие данным наблюдениям.

Важность предиктора

В предикторе (или переменная) выбор, цель состоит в том, чтобы выбрать как можно меньше предикторов при сохранении как можно большей информации (прогнозирующая точность) о данных. В creditscorecard класс, fitmodel функционируйте внутренне выбирает предикторы и возвращает p-значения для каждого предиктора. Аналитик может затем вне creditscorecard рабочий процесс, установленный порог для этих p-значений и, выбирает предикторы, которые стоит сохранить и предикторы, чтобы отбросить. Этот шаг полезен, когда количество предикторов является большим.

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

Используя логистическую регрессию для важности предиктора

Важность предиктора связана с понятием весов предиктора, поскольку вес предиктора определяет, насколько важный это находится в присвоении итогового счета, и поэтому, в PD. Вычислительные веса предиктора являются быстро и легко определяемым методом, посредством чего веса определяются путем деления области значений точек для каждого предиктора общей областью значений точек для целого creditscorecard объект. Для получения дополнительной информации об этом рабочем процессе смотрите Тематическое исследование для Анализа Протокола результатов Кредита (Financial Toolbox).

В данном примере используйте 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));
xtickangle(45);

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

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

В этом случае, '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)
xtickangle(45)
legend({'logit','DT'})

Обратите внимание на то, что эти результаты зависят от алгоритма раскладывания, который вы выбираете для creditscorecard возразите и параметры, используемые в fitctree создавать дерево решений.

Проверка допустимости модели

creditscorecard функциональный validatemodel попытки вычислить баллы на основе внутренне вычисленных точек. Когда вы используете деревья решений, вы не можете непосредственно запустить валидацию, потому что коэффициенты модели неизвестны и не могут быть сопоставлены от ФУНТОВ.

Подтверждать 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')

tValidation = table(Measure,StatsL.Value(1:end-1),StatsDT.Value,'VariableNames',...
    {'Measure','logit','DT'});

disp(tValidation)
            Measure              logit       DT   
    ________________________    _______    _______

    {'Accuracy Ratio'      }    0.32515    0.38921
    {'Area Under ROC Curve'}    0.66258    0.69461
    {'KS Statistic'        }    0.23204    0.29544

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

Сводные данные

Этот пример сравнивает модели выигрыша логистической регрессии и дерева решений с помощью CreditCardData.mat набор данных. Рабочий процесс представлен, чтобы вычислить и сравнить ФУНТЫ с помощью деревьев решений. Модель дерева принятия решения подтверждается и контрастируется с моделью логистической регрессии.

При рассмотрении результатов помните, что эти результаты зависят от выбора набора данных и алгоритма раскладывания по умолчанию (монотонный смежный алгоритм объединения) в рабочем процессе логистической регрессии.

  • Являются ли логистическая регрессия или модель дерева принятия решения лучшей моделью выигрыша, зависит от набора данных и выбора алгоритма раскладывания. Несмотря на то, что модель дерева принятия решения в этом примере является лучшей моделью выигрыша, модель логистической регрессии производит более высокое отношение точности (0.42), AUROC (0.71), и статистическая величина KS (0.30) значения, если алгоритм раскладывания для объекта creditscorecard установлен как 'Split' с Gini как критерий разделения.

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

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

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