В этом примере показано, как создать creditscorecard
объект, данные об интервале, отображение, и строят сгруппированную информацию о данных. Этот пример также показывает, как подбирать модель логистической регрессии, получить счет к модели протокола результатов, и определить вероятности значения по умолчанию и подтвердить модель протокола результатов кредита использование трех различных метрик.
Используйте CreditCardData.mat
файл, чтобы загрузить data
(использование набора данных от Refaat 2011). Если ваш data
содержит много предикторов, можно сначала использовать screenpredictors
(Risk Management Toolbox) от Risk Management Toolbox™, чтобы срезать потенциально большой набор предикторов к подмножеству, которое является самым прогнозирующим из переменной отклика протокола результатов кредита. Можно затем использовать это подмножество предикторов при создании creditscorecard
объект.
При создании creditscorecard
объект, по умолчанию, 'ResponseVar'
установлен в последний столбец в данных ('status'
в этом примере) и 'GoodLabel'
к значению отклика с самым высоким количеством (0
в этом примере). Синтаксис для creditscorecard
указывает на тот 'CustID'
'IDVar'
удалить из списка предикторов. Кроме того, в то время как не продемонстрированный в этом примере, при создании creditscorecard
объектное использование creditscorecard
, можно использовать дополнительный аргумент пары "имя-значение" 'WeightsVar'
задавать наблюдение (выборка) веса или 'BinMissingData'
к интервалу недостающие данные.
load CreditCardData sc = creditscorecard(data,'IDVar','CustID')
sc = creditscorecard with properties: GoodLabel: 0 ResponseVar: 'status' WeightsVar: '' VarNames: {1x11 cell} NumericPredictors: {1x6 cell} CategoricalPredictors: {'ResStatus' 'EmpStatus' 'OtherCC'} BinMissingData: 0 IDVar: 'CustID' PredictorVars: {1x9 cell} Data: [1200x11 table]
Выполните некоторое исследование исходных данных. Справьтесь о статистике предиктора для категориальной переменной 'ResStatus'
и постройте информацию об интервале для 'ResStatus'
.
bininfo(sc,'ResStatus')
ans=4×6 table
Bin Good Bad Odds WOE InfoValue
______________ ____ ___ ______ _________ _________
{'Home Owner'} 365 177 2.0621 0.019329 0.0001682
{'Tenant' } 307 167 1.8383 -0.095564 0.0036638
{'Other' } 131 53 2.4717 0.20049 0.0059418
{'Totals' } 803 397 2.0227 NaN 0.0097738
plotbins(sc,'ResStatus')
Эта информация об интервале содержит частоты “Хороших” и “Плохих”, и статистика интервала. Постарайтесь не иметь интервалы с частотами нуля, потому что они приводят к бесконечному или неопределенному (NaN
) статистика. Используйте modifybins
или autobinning
функции к интервалу данные соответственно.
Для числовых данных общий первый шаг является "прекрасной классификацией". Это означает раскладывание данные в несколько интервалов, заданных с обычной сеткой. Чтобы проиллюстрировать этот тезис, используйте предиктор 'CustIncome'
.
cp = 20000:5000:60000; sc = modifybins(sc,'CustIncome','CutPoints',cp); bininfo(sc,'CustIncome')
ans=11×6 table
Bin Good Bad Odds WOE InfoValue
_________________ ____ ___ _______ _________ __________
{'[-Inf,20000)' } 3 5 0.6 -1.2152 0.010765
{'[20000,25000)'} 23 16 1.4375 -0.34151 0.0039819
{'[25000,30000)'} 38 47 0.80851 -0.91698 0.065166
{'[30000,35000)'} 131 75 1.7467 -0.14671 0.003782
{'[35000,40000)'} 193 98 1.9694 -0.026696 0.00017359
{'[40000,45000)'} 173 76 2.2763 0.11814 0.0028361
{'[45000,50000)'} 131 47 2.7872 0.32063 0.014348
{'[50000,55000)'} 82 24 3.4167 0.52425 0.021842
{'[55000,60000)'} 21 8 2.625 0.26066 0.0015642
{'[60000,Inf]' } 8 1 8 1.375 0.010235
{'Totals' } 803 397 2.0227 NaN 0.13469
plotbins(sc,'CustIncome')
Используйте autobinning
функция, чтобы выполнить автоматическое раскладывание для каждого переменного предиктора, с помощью 'Monotone'
по умолчанию алгоритм с опциями алгоритма по умолчанию.
sc = autobinning(sc);
После автоматического шага раскладывания каждый интервал предиктора должен быть рассмотрен с помощью bininfo
и plotbins
функции и подстроенный. Монотонный, идеально линейный тренд в Весе доказательства (WOE) желателен для протоколов результатов кредита, потому что это переводит в линейные точки для данного предиктора. Тренды WOE могут визуализироваться с помощью plotbins
.
plotbins(sc,sc.PredictorVars)
В отличие от первоначального графика 'ResStatus'
когда протокол результатов был создан, новый график для 'ResStatus'
показывает увеличивающийся тренд WOE. Это вызвано тем, что autobinning
функция, по умолчанию, сортирует порядок категорий путем увеличения разногласий.
Эти графики показывают что 'Monotone'
алгоритм делает хорошее задание, находящее монотонные тренды WOE для этого набора данных. Чтобы завершить процесс раскладывания, необходимо внести только несколько ручных корректировок для некоторых предикторов с помощью modifybins
функция.
Общие шаги, чтобы вручную изменить интервалы:
Используйте bininfo
функция с двумя выходными аргументами, где второй аргумент содержит правила раскладывания.
Вручную измените правила раскладывания с помощью второго выходного аргумента от bininfo
.
Установите обновленные правила раскладывания с modifybins
и затем используйте plotbins
или bininfo
рассмотреть обновленные интервалы.
Например, на основе графика для 'CustAge'
на Шаге 2a интервалы номер 1 и 2 имеют подобное ГОРЕ также, как и интервалы номер 5 и 6. Объединять эти интервалы с помощью шагов, обрисованных в общих чертах выше:
[bi,cp] = bininfo(sc,'CustAge'); cp([1 5]) = []; % To merge bins 1 and 2, and bins 5 and 6 sc = modifybins(sc,'CustAge','CutPoints',cp); plotbins(sc,'CustAge')
Для 'CustIncome'
, на основе графика выше, лучше объединять интервалы 3, 4 и 5, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:
[bi,cp] = bininfo(sc,'CustIncome'); cp([3 4]) = []; sc = modifybins(sc,'CustIncome','CutPoints',cp); plotbins(sc,'CustIncome')
Для 'TmWBank'
, на основе графика выше, лучше объединять интервалы 2 и 3, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:
[bi,cp] = bininfo(sc,'TmWBank'); cp(2) = []; sc = modifybins(sc,'TmWBank','CutPoints',cp); plotbins(sc,'TmWBank')
Для 'AMBalance'
, на основе графика выше, лучше объединять интервалы 2 и 3, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:
[bi,cp] = bininfo(sc,'AMBalance'); cp(2) = []; sc = modifybins(sc,'AMBalance','CutPoints',cp); plotbins(sc,'AMBalance')
Теперь, когда подстройка раскладывания завершается, интервалы для всех предикторов имеют близко-к-линейному тренды WOE.
fitmodel
функция подбирает модель логистической регрессии к данным WOE. fitmodel
внутренне интервалы обучающие данные, преобразовывает его в значения WOE, сопоставляет переменную отклика так, чтобы 'Good'
1
, и подбирает линейную модель логистической регрессии. По умолчанию, fitmodel
использует пошаговую процедуру, чтобы определить, которым предикторы должны быть в модели.
sc = fitmodel(sc);
1. Adding CustIncome, Deviance = 1490.8954, Chi2Stat = 32.545914, PValue = 1.1640961e-08 2. Adding TmWBank, Deviance = 1467.3249, Chi2Stat = 23.570535, PValue = 1.2041739e-06 3. Adding AMBalance, Deviance = 1455.858, Chi2Stat = 11.466846, PValue = 0.00070848829 4. Adding EmpStatus, Deviance = 1447.6148, Chi2Stat = 8.2432677, PValue = 0.0040903428 5. Adding CustAge, Deviance = 1442.06, Chi2Stat = 5.5547849, PValue = 0.018430237 6. Adding ResStatus, Deviance = 1437.9435, Chi2Stat = 4.1164321, PValue = 0.042468555 7. Adding OtherCC, Deviance = 1433.7372, Chi2Stat = 4.2063597, PValue = 0.040272676 Generalized linear regression model: status ~ [Linear formula with 8 terms in 7 predictors] Distribution = Binomial Estimated Coefficients: Estimate SE tStat pValue ________ _______ ______ __________ (Intercept) 0.7024 0.064 10.975 5.0407e-28 CustAge 0.61562 0.24783 2.4841 0.012988 ResStatus 1.3776 0.65266 2.1107 0.034799 EmpStatus 0.88592 0.29296 3.024 0.0024946 CustIncome 0.69836 0.21715 3.216 0.0013001 TmWBank 1.106 0.23266 4.7538 1.9958e-06 OtherCC 1.0933 0.52911 2.0662 0.038806 AMBalance 1.0437 0.32292 3.2322 0.0012285 1200 observations, 1192 error degrees of freedom Dispersion: 1 Chi^2-statistic vs. constant model: 89.7, p-value = 1.42e-16
После того, чтобы подбирать логистическую модель по умолчанию моменты не масштабированы и наступают непосредственно от комбинации значений WOE и коэффициентов модели. displaypoints
функция обобщает точки протокола результатов.
p1 = displaypoints(sc); disp(p1)
Predictors Bin Points ______________ ____________________ _________ {'CustAge' } {'[-Inf,37)' } -0.15314 {'CustAge' } {'[37,40)' } -0.062247 {'CustAge' } {'[40,46)' } 0.045763 {'CustAge' } {'[46,58)' } 0.22888 {'CustAge' } {'[58,Inf]' } 0.48354 {'CustAge' } {'<missing>' } NaN {'ResStatus' } {'Tenant' } -0.031302 {'ResStatus' } {'Home Owner' } 0.12697 {'ResStatus' } {'Other' } 0.37652 {'ResStatus' } {'<missing>' } NaN {'EmpStatus' } {'Unknown' } -0.076369 {'EmpStatus' } {'Employed' } 0.31456 {'EmpStatus' } {'<missing>' } NaN {'CustIncome'} {'[-Inf,29000)' } -0.45455 {'CustIncome'} {'[29000,33000)' } -0.1037 {'CustIncome'} {'[33000,42000)' } 0.077768 {'CustIncome'} {'[42000,47000)' } 0.24406 {'CustIncome'} {'[47000,Inf]' } 0.43536 {'CustIncome'} {'<missing>' } NaN {'TmWBank' } {'[-Inf,12)' } -0.18221 {'TmWBank' } {'[12,45)' } -0.038279 {'TmWBank' } {'[45,71)' } 0.39569 {'TmWBank' } {'[71,Inf]' } 0.95074 {'TmWBank' } {'<missing>' } NaN {'OtherCC' } {'No' } -0.193 {'OtherCC' } {'Yes' } 0.15868 {'OtherCC' } {'<missing>' } NaN {'AMBalance' } {'[-Inf,558.88)' } 0.3552 {'AMBalance' } {'[558.88,1597.44)'} -0.026797 {'AMBalance' } {'[1597.44,Inf]' } -0.21168 {'AMBalance' } {'<missing>' } NaN
Это - хорошее время, чтобы изменить метки интервала, если это - что-то представляющее интерес по косметическим причинам. Для этого используйте modifybins
изменить метки интервала.
sc = modifybins(sc,'CustAge','BinLabels',... {'Up to 36' '37 to 39' '40 to 45' '46 to 57' '58 and up'}); sc = modifybins(sc,'CustIncome','BinLabels',... {'Up to 28999' '29000 to 32999' '33000 to 41999' '42000 to 46999' '47000 and up'}); sc = modifybins(sc,'TmWBank','BinLabels',... {'Up to 11' '12 to 44' '45 to 70' '71 and up'}); sc = modifybins(sc,'AMBalance','BinLabels',... {'Up to 558.87' '558.88 to 1597.43' '1597.44 and up'}); p1 = displaypoints(sc); disp(p1)
Predictors Bin Points ______________ _____________________ _________ {'CustAge' } {'Up to 36' } -0.15314 {'CustAge' } {'37 to 39' } -0.062247 {'CustAge' } {'40 to 45' } 0.045763 {'CustAge' } {'46 to 57' } 0.22888 {'CustAge' } {'58 and up' } 0.48354 {'CustAge' } {'<missing>' } NaN {'ResStatus' } {'Tenant' } -0.031302 {'ResStatus' } {'Home Owner' } 0.12697 {'ResStatus' } {'Other' } 0.37652 {'ResStatus' } {'<missing>' } NaN {'EmpStatus' } {'Unknown' } -0.076369 {'EmpStatus' } {'Employed' } 0.31456 {'EmpStatus' } {'<missing>' } NaN {'CustIncome'} {'Up to 28999' } -0.45455 {'CustIncome'} {'29000 to 32999' } -0.1037 {'CustIncome'} {'33000 to 41999' } 0.077768 {'CustIncome'} {'42000 to 46999' } 0.24406 {'CustIncome'} {'47000 and up' } 0.43536 {'CustIncome'} {'<missing>' } NaN {'TmWBank' } {'Up to 11' } -0.18221 {'TmWBank' } {'12 to 44' } -0.038279 {'TmWBank' } {'45 to 70' } 0.39569 {'TmWBank' } {'71 and up' } 0.95074 {'TmWBank' } {'<missing>' } NaN {'OtherCC' } {'No' } -0.193 {'OtherCC' } {'Yes' } 0.15868 {'OtherCC' } {'<missing>' } NaN {'AMBalance' } {'Up to 558.87' } 0.3552 {'AMBalance' } {'558.88 to 1597.43'} -0.026797 {'AMBalance' } {'1597.44 and up' } -0.21168 {'AMBalance' } {'<missing>' } NaN
Точки обычно масштабируются и также часто округляются. Для этого используйте formatpoints
функция. Например, можно установить целевой уровень точек, соответствующих целевому уровню разногласий, и также установить необходимые точки удваивать разногласия (PDO).
TargetPoints = 500; TargetOdds = 2; PDO = 50; % Points to double the odds sc = formatpoints(sc,'PointsOddsAndPDO',[TargetPoints TargetOdds PDO]); p2 = displaypoints(sc); disp(p2)
Predictors Bin Points ______________ _____________________ ______ {'CustAge' } {'Up to 36' } 53.239 {'CustAge' } {'37 to 39' } 59.796 {'CustAge' } {'40 to 45' } 67.587 {'CustAge' } {'46 to 57' } 80.796 {'CustAge' } {'58 and up' } 99.166 {'CustAge' } {'<missing>' } NaN {'ResStatus' } {'Tenant' } 62.028 {'ResStatus' } {'Home Owner' } 73.445 {'ResStatus' } {'Other' } 91.446 {'ResStatus' } {'<missing>' } NaN {'EmpStatus' } {'Unknown' } 58.777 {'EmpStatus' } {'Employed' } 86.976 {'EmpStatus' } {'<missing>' } NaN {'CustIncome'} {'Up to 28999' } 31.497 {'CustIncome'} {'29000 to 32999' } 56.805 {'CustIncome'} {'33000 to 41999' } 69.896 {'CustIncome'} {'42000 to 46999' } 81.891 {'CustIncome'} {'47000 and up' } 95.69 {'CustIncome'} {'<missing>' } NaN {'TmWBank' } {'Up to 11' } 51.142 {'TmWBank' } {'12 to 44' } 61.524 {'TmWBank' } {'45 to 70' } 92.829 {'TmWBank' } {'71 and up' } 132.87 {'TmWBank' } {'<missing>' } NaN {'OtherCC' } {'No' } 50.364 {'OtherCC' } {'Yes' } 75.732 {'OtherCC' } {'<missing>' } NaN {'AMBalance' } {'Up to 558.87' } 89.908 {'AMBalance' } {'558.88 to 1597.43'} 62.353 {'AMBalance' } {'1597.44 and up' } 49.016 {'AMBalance' } {'<missing>' } NaN
score
функция вычисляет музыку к обучающим данным. Дополнительный data
введите может также быть передан score
, например, данные о валидации. Точки на предиктор для каждого клиента обеспечиваются как дополнительный выход.
[Scores,Points] = score(sc); disp(Scores(1:10))
528.2044 554.8861 505.2406 564.0717 554.8861 586.1904 441.8755 515.8125 524.4553 508.3169
disp(Points(1:10,:))
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance _______ _________ _________ __________ _______ _______ _________ 80.796 62.028 58.777 95.69 92.829 75.732 62.353 99.166 73.445 86.976 95.69 61.524 75.732 62.353 80.796 62.028 86.976 69.896 92.829 50.364 62.353 80.796 73.445 86.976 95.69 61.524 75.732 89.908 99.166 73.445 86.976 95.69 61.524 75.732 62.353 99.166 73.445 86.976 95.69 92.829 75.732 62.353 53.239 73.445 58.777 56.805 61.524 75.732 62.353 80.796 91.446 86.976 95.69 61.524 50.364 49.016 80.796 62.028 58.777 95.69 61.524 75.732 89.908 80.796 73.445 58.777 95.69 61.524 75.732 62.353
Чтобы вычислить вероятность значения по умолчанию, используйте probdefault
функция.
pd = probdefault(sc);
Задайте вероятность того, чтобы быть “Хорошим” и постройте предсказанные разногласия по сравнению с отформатированными баллами. Визуально анализируйте это целевые точки и предназначайтесь для соответствия разногласий и что точки, чтобы удвоить разногласия (PDO) отношение содержат.
ProbGood = 1-pd; PredictedOdds = ProbGood./pd; figure scatter(Scores,PredictedOdds) title('Predicted Odds vs. Score') xlabel('Score') ylabel('Predicted Odds') hold on xLimits = xlim; yLimits = ylim; % Target points and odds plot([TargetPoints TargetPoints],[yLimits(1) TargetOdds],'k:') plot([xLimits(1) TargetPoints],[TargetOdds TargetOdds],'k:') % Target points plus PDO plot([TargetPoints+PDO TargetPoints+PDO],[yLimits(1) 2*TargetOdds],'k:') plot([xLimits(1) TargetPoints+PDO],[2*TargetOdds 2*TargetOdds],'k:') % Target points minus PDO plot([TargetPoints-PDO TargetPoints-PDO],[yLimits(1) TargetOdds/2],'k:') plot([xLimits(1) TargetPoints-PDO],[TargetOdds/2 TargetOdds/2],'k:') hold off
creditscorecard
класс поддерживает три метода валидации, Совокупный профиль точности (CAP), Рабочую характеристику приемника (ROC) и Кольмогорова-Смирнова (K-S) статистическая величина. Для получения дополнительной информации о ДНЕ ROC и KS, видят Совокупный профиль точности (CAP), Рабочую характеристику приемника (ROC) и статистическую величину Кольмогорова-Смирнова (KS).
[Stats,T] = validatemodel(sc,'Plot',{'CAP','ROC','KS'});
disp(Stats)
Measure Value ________________________ _______ {'Accuracy Ratio' } 0.32225 {'Area under ROC curve'} 0.66113 {'KS statistic' } 0.22324 {'KS score' } 499.18
disp(T(1:15,:))
Scores ProbDefault TrueBads FalseBads TrueGoods FalseGoods Sensitivity FalseAlarm PctObs ______ ___________ ________ _________ _________ __________ ___________ __________ __________ 369.4 0.7535 0 1 802 397 0 0.0012453 0.00083333 377.86 0.73107 1 1 802 396 0.0025189 0.0012453 0.0016667 379.78 0.7258 2 1 802 395 0.0050378 0.0012453 0.0025 391.81 0.69139 3 1 802 394 0.0075567 0.0012453 0.0033333 394.77 0.68259 3 2 801 394 0.0075567 0.0024907 0.0041667 395.78 0.67954 4 2 801 393 0.010076 0.0024907 0.005 396.95 0.67598 5 2 801 392 0.012594 0.0024907 0.0058333 398.37 0.67167 6 2 801 391 0.015113 0.0024907 0.0066667 401.26 0.66276 7 2 801 390 0.017632 0.0024907 0.0075 403.23 0.65664 8 2 801 389 0.020151 0.0024907 0.0083333 405.09 0.65081 8 3 800 389 0.020151 0.003736 0.0091667 405.15 0.65062 11 5 798 386 0.027708 0.0062267 0.013333 405.37 0.64991 11 6 797 386 0.027708 0.007472 0.014167 406.18 0.64735 12 6 797 385 0.030227 0.007472 0.015 407.14 0.64433 13 6 797 384 0.032746 0.007472 0.015833
autobinning
| bindata
| bininfo
| compact
| creditscorecard
| displaypoints
| fitmodel
| formatpoints
| modifybins
| modifypredictor
| plotbins
| predictorinfo
| probdefault
| score
| setmodel
| validatemodel