Чтобы вычислить счета для creditscorecard объект с ограничениями на равенство, неравенство или ограничения коэффициентов логистической регрессионой модели, используйте fitConstrainedModel. В отличие от fitmodel, fitConstrainedModel решает как задачу без ограничений, так и задачу с ограничениями. Текущий решатель, используемый для минимизации целевой функции для fitConstrainedModel является fmincon, из Optimization Toolbox™.
Этот пример имеет три основных раздела. Во-первых, fitConstrainedModel используется для решения коэффициентов в модели без ограничений. Затем, fitConstrainedModel демонстрирует, как использовать несколько типов ограничений. Наконец, fitConstrainedModel использует bootstrapping для анализа значимости, чтобы определить, какие предикторы отклонить из модели.
creditscorecard Данные объекта и интервалаload CreditCardData.mat sc = creditscorecard(data,'IDVar','CustID'); sc = autobinning(sc);
fitConstrainedModelРешить для коэффициентов без ограничений используя fitConstrainedModel с значениями по умолчанию для входных параметров. fitConstrainedModel использует внутренний решатель оптимизации fmincon из Optimization Toolbox™. Если вы не устанавливаете никаких ограничений, fmincon рассматривает модель как задачу оптимизации без ограничений. Параметры по умолчанию для LowerBound и UpperBound являются -Inf и +Inf, соответственно. Для ограничений равенства и неравенства по умолчанию является пустым числовым массивом.
[sc1,mdl1] = fitConstrainedModel(sc); coeff1 = mdl1.Coefficients.Estimate; disp(mdl1.Coefficients);
Estimate
_________
(Intercept) 0.70246
CustAge 0.6057
TmAtAddress 1.0381
ResStatus 1.3794
EmpStatus 0.89648
CustIncome 0.70179
TmWBank 1.1132
OtherCC 1.0598
AMBalance 1.0572
UtilRate -0.047597
В отличие от fitmodel что дает p-значения, при использовании fitConstrainedModelнеобходимо использовать bootstrapping, чтобы выяснить, какие предикторы отклоняются из модели, когда они удовлетворяют ограничениям. Это показано в разделе «Загрузка значения».
fitmodel Сравнение результатов и калибровка моделиfitmodel подходит для логистической регрессионной модели к данным о весе доказательств (WOE), и нет никаких ограничений. Можно сравнить результаты из раздела «Без ограничений Модель с использованием fitConstrainedModel» с результатами fitmodel чтобы убедиться, что модель хорошо калибрована.
Теперь решите задачу без ограничений, используя fitmodel. Обратите внимание, что fitmodel и fitConstrainedModel использовать другие решатели. Пока fitConstrainedModel использует fmincon, fitmodel использует stepwiseglm по умолчанию. Чтобы включить все предикторы с самого начала, установите 'VariableSelection' Аргумент пары "имя-значение" из fitmodel на 'fullmodel'.
[sc2,mdl2] = fitmodel(sc,'VariableSelection','fullmodel','Display','off'); coeff2 = mdl2.Coefficients.Estimate; disp(mdl2.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
figure plot(coeff1,'*') hold on plot(coeff2,'s') xticklabels(mdl1.Coefficients.Properties.RowNames) ylabel('Model Coefficients') title('Unconstrained Model Coefficients') legend({'Calculated by fitConstrainedModel with defaults','Calculated by fimodel'},'Location','best') grid on

Как показывают и таблицы, и график, коэффициенты модели совпадают. Можно быть уверенным, что эта реализация fitConstrainedModel хорошо калиброван.
В подходе с ограничениями модели вы решаете для значений коэффициентов логистической модели, удовлетворяющей ограничениям. Поддерживаемые ограничения являются связанными, равенством или неравенством. Коэффициенты максимизируют определенную функцию правдоподобия по умолчанию для наблюдения , как:
где:
является неизвестным коэффициентом модели
- значения предиктора при наблюдении
- значение отклика; значение 1 представляет собой значение по умолчанию, а значение 0 представляет собой значение, отличное от значения по умолчанию
Эта формула предназначена для невзвешенных данных. Когда наблюдение i имеет вес , это означает, что есть Как много наблюдений i. Поэтому вероятность того, что дефолт происходит при наблюдении i, является продуктом вероятностей дефолта:
Точно так же вероятность ненападения для взвешенного наблюдения i равна:
Для взвешенных данных, если существует значение по умолчанию при заданном наблюдении i, чей вес является , это как если бы был отсчет этого наблюдения, и все они либо все по умолчанию, либо все не по умолчанию. может быть или не быть целым числом.
Поэтому для взвешенных данных функция правдоподобия по умолчанию для наблюдения i в первом уравнении становится
По предположению, все значения по умолчанию являются независимыми событиями, поэтому целевая функция является
или, в более удобных логарифмических терминах:
После калибровки модели без ограничений, как описано в разделе «Модель без ограничений с использованием fitConstrainedModel», можно решить для коэффициентов модели, удовлетворяющих ограничениям. Можно выбрать нижнюю и верхнюю границы, такие что , кроме точки пересечения. Кроме того, поскольку возраст клиента и доход клиента несколько коррелируются, можно также использовать дополнительные ограничения на их коэффициенты, например, . Коэффициенты, соответствующие предикторам 'CustAge' и 'CustIncome' в этом примере и , соответственно.
K = length(sc.PredictorVars); lb = [-Inf;zeros(K,1)]; ub = [Inf;ones(K,1)]; AIneq = [0 -1 0 0 0 1 0 0 0 0;0 -1 0 0 0 -1 0 0 0 0]; bIneq = [0.05;0.05]; Options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'Display','off'); [sc3,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,... 'LowerBound',lb,'UpperBound',ub,'Options',Options); figure plot(coeff1,'*','MarkerSize',8) hold on plot(mdl.Coefficients.Estimate,'.','MarkerSize',12) line(xlim,[0 0],'color','k','linestyle',':') line(xlim,[1 1],'color','k','linestyle',':') text(1.1,0.1,'Lower bound') text(1.1,1.1,'Upper bound') grid on xticklabels(mdl.Coefficients.Properties.RowNames) ylabel('Model Coefficients') title('Comparison Between Unconstrained and Constrained Solutions') legend({'Unconstrained','Constrained'},'Location','best')

Для задачи без ограничений стандартные формулы доступны для вычисления p-значений, которые вы используете, чтобы вычислить, какие коэффициенты значительны, а какие должны быть отклонены. Однако для ограниченной задачи стандартные формулы недоступны, и вывод формул для анализа значимости сложен. Практической альтернативой является выполнение анализа значимости посредством начальной загрузки.
В подходе bootstrapping при использовании fitConstrainedModel, вы устанавливаете аргумент имя-значение 'Bootstrap' на true и выберите значение для аргумента имя-значение 'BootstrapIter'. Загрузка означает, что выбирают выборки (с заменой) из исходных наблюдений. В каждой итерации fitConstrainedModel решает ту же задачу с ограничениями, что и раздел «Ограниченная модель». fitConstrainedModel получает несколько значений (решений) для каждого коэффициента и вы можете построить их как boxplot или histogram. Используя boxplot или гистограмму, можно изучить медианные значения, чтобы оценить, отдалены ли коэффициенты от нуля и насколько коэффициенты отклоняются от их средств.
lb = [-Inf;zeros(K,1)]; ub = [Inf;ones(K,1)]; AIneq = [0 -1 0 0 0 1 0 0 0 0;0 1 0 0 0 -1 0 0 0 0]; bIneq = [0.05;0.05]; c0 = zeros(K,1); NIter = 100; Options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'Display','off'); rng('default') [sc,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,... 'LowerBound',lb,'UpperBound',ub,'Bootstrap',true,'BootstrapIter',NIter,'Options',Options); figure boxplot(mdl.Bootstrap.Matrix,mdl.Coefficients.Properties.RowNames) hold on line(xlim,[0 0],'color','k','linestyle',':') line(xlim,[1 1],'color','k','linestyle',':') title('Bootstrapping with N = 100 Iterations') ylabel('Model Coefficients')

Твердые красные линии в прямоугольном графике указывают, что средние значения и нижний и верхние края для и процентили. «Усы» - это минимальное и максимальное значения, не включая выбросы. Пунктирные линии представляют нижнее и верхнее ограничения на коэффициенты. В этом примере коэффициенты не могут быть отрицательными, по конструкции.
Чтобы помочь решить, какие предикторы сохранить в модели, оцените долю раз, когда каждый коэффициент равен нулю.
Tol = 1e-6; figure bar(100*sum(mdl.Bootstrap.Matrix<= Tol)/NIter) ylabel('% of Zeros') title('Percentage of Zeros Over Bootstrap Iterations') xticklabels(mdl.Coefficients.Properties.RowNames) grid on

Исходя из графика, можно отклонить 'UtilRate' поскольку это самое большое число нулевых значений. Можно также принять решение об отклонении 'TmAtAddress' поскольку он показывает пик, хотя и небольшой.
Чтобы установить соответствующие коэффициенты равными нулю, установите их верхнюю границу равной нулю и снова решите модель, используя исходный набор данных.
ub(3) = 0; ub(end) = 0; [sc,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,'LowerBound',lb,'UpperBound',ub,'Options',Options); Ind = (abs(mdl.Coefficients.Estimate) <= Tol); ModelCoeff = mdl.Coefficients.Estimate(~Ind); ModelPreds = mdl.Coefficients.Properties.RowNames(~Ind)'; figure hold on plot(ModelCoeff,'.','MarkerSize',12) ylim([0.2 1.2]) ylabel('Model Coefficients') xticklabels(ModelPreds) title('Selected Model Coefficients After Bootstrapping') grid on

creditscorecardТеперь, когда вы решили для ограниченных коэффициентов, используйте setmodel задать коэффициенты и предикторы модели. Затем можно вычислить (не масштабированные) точки.
ModelPreds = ModelPreds(2:end); sc = setmodel(sc,ModelPreds,ModelCoeff); p = displaypoints(sc); disp(p)
Predictors Bin Points
______________ _____________________ _________
{'CustAge' } {'[-Inf,33)' } -0.16725
{'CustAge' } {'[33,37)' } -0.14811
{'CustAge' } {'[37,40)' } -0.065607
{'CustAge' } {'[40,46)' } 0.044404
{'CustAge' } {'[46,48)' } 0.21761
{'CustAge' } {'[48,58)' } 0.23404
{'CustAge' } {'[58,Inf]' } 0.49029
{'CustAge' } {'<missing>' } NaN
{'ResStatus' } {'Tenant' } 0.0044307
{'ResStatus' } {'Home Owner' } 0.11932
{'ResStatus' } {'Other' } 0.30048
{'ResStatus' } {'<missing>' } NaN
{'EmpStatus' } {'Unknown' } -0.077028
{'EmpStatus' } {'Employed' } 0.31459
{'EmpStatus' } {'<missing>' } NaN
{'CustIncome'} {'[-Inf,29000)' } -0.43795
{'CustIncome'} {'[29000,33000)' } -0.097814
{'CustIncome'} {'[33000,35000)' } 0.053667
{'CustIncome'} {'[35000,40000)' } 0.081921
{'CustIncome'} {'[40000,42000)' } 0.092364
{'CustIncome'} {'[42000,47000)' } 0.23932
{'CustIncome'} {'[47000,Inf]' } 0.42477
{'CustIncome'} {'<missing>' } NaN
{'TmWBank' } {'[-Inf,12)' } -0.15547
{'TmWBank' } {'[12,23)' } -0.031077
{'TmWBank' } {'[23,45)' } -0.021091
{'TmWBank' } {'[45,71)' } 0.36703
{'TmWBank' } {'[71,Inf]' } 0.86888
{'TmWBank' } {'<missing>' } NaN
{'OtherCC' } {'No' } -0.16832
{'OtherCC' } {'Yes' } 0.15336
{'OtherCC' } {'<missing>' } NaN
{'AMBalance' } {'[-Inf,558.88)' } 0.34418
{'AMBalance' } {'[558.88,1254.28)' } -0.012745
{'AMBalance' } {'[1254.28,1597.44)'} -0.057879
{'AMBalance' } {'[1597.44,Inf]' } -0.19896
{'AMBalance' } {'<missing>' } NaN
Используя немасштабированные точки, можно следовать оставшейся части рабочего процесса моделирования карты показателей кредита, чтобы вычислить счета и вероятности дефолта и подтвердить модель.
autobinning | bindata | bininfo | compact | creditscorecard | displaypoints | fitmodel | formatpoints | modifybins | modifypredictor | plotbins | predictorinfo | probdefault | score | setmodel | validatemodel